ด้วยคอลัมน์ประเภทสตริงเช่นcharacter(2)(ดังที่คุณกล่าวถึงในภายหลัง) การต่อข้อมูลที่แสดงนั้นใช้งานได้เพราะอ้างถึงคู่มือ:
[ ... ] ผู้ประกอบการ concatenation สตริง ( ||) รับข้อมูลที่ไม่ใช่สตริงตราบใดที่อย่างน้อยหนึ่งการป้อนข้อมูลเป็นประเภทสตริงดังแสดงใน
ตารางที่ 9.8 สำหรับกรณีอื่น ๆ แทรกการข่มขู่ที่ชัดเจนไปที่text[... ]
เหมืองเน้นหนัก ตัวอย่างที่ 2 ( select a||', '||b from foo) ใช้งานได้กับชนิดข้อมูลใด ๆเนื่องจาก', 'ค่าเริ่มต้นตัวอักษรสตริงที่ไม่ได้พิมพ์เพื่อพิมพ์textทำให้นิพจน์ทั้งหมดถูกต้องในทุกกรณี
สำหรับชนิดข้อมูลที่ไม่ใช่สตริงคุณสามารถ "แก้ไข" คำสั่งที่ 1 โดยการหล่อtextอย่างน้อยหนึ่งอาร์กิวเมนต์ ( ประเภทใดก็ได้ที่สามารถส่งไปยังtext):
SELECT a::text || b AS ab FROM foo;
ตัดสินจากคำตอบของคุณเองว่า " ไม่ทำงาน " ควรจะหมายถึง " return NULL " ผลลัพธ์ของสิ่งที่ต่อกันเป็น NULL คือ NULL หากค่า NULLสามารถมีส่วนร่วมและผลลัพธ์จะต้องไม่เป็น NULL ใช้concat_ws()เพื่อเชื่อมค่าจำนวนเท่าใดก็ได้ (Postgres 9.1 หรือใหม่กว่า):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
หรือconcat()ถ้าคุณไม่ต้องการตัวคั่น:
SELECT concat(a, b) AS ab FROM foo;
ไม่จำเป็นต้องใช้การพิมพ์แบบนี้เนื่องจากทั้งสองฟังก์ชั่นรับ"any"อินพุตและทำงานกับการแทนข้อความ
รายละเอียดเพิ่มเติม (และทำไมCOALESCEผู้แทนที่ไม่ดี) ในคำตอบที่เกี่ยวข้องนี้:
+ไม่ใช่ตัวดำเนินการที่ถูกต้องสำหรับการต่อสตริงใน Postgres (หรือ SQL มาตรฐาน) เป็นความคิดส่วนตัวของ Microsoft ที่จะเพิ่มลงในผลิตภัณฑ์ของตน
ไม่ค่อยมีเหตุผลที่ดีใด ๆ ในการใช้งานcharacter(n)(ไวพจน์: char(n)) ใช้หรือtext varcharรายละเอียด:
textประเภทอื่น