Với các cột kiểu chuỗi như character(2)
(như bạn đã đề cập sau), phép nối được hiển thị chỉ hoạt động vì, trích dẫn hướng dẫn:
[...] Toán tử nối chuỗi ( ||
) chấp nhận đầu vào không phải chuỗi, miễn là có ít nhất một đầu vào thuộc loại chuỗi , như trong
Bảng 9.8 . Đối với các trường hợp khác, chèn một ép buộc rõ ràng vào text
[...]
Nhấn mạnh đậm của tôi. Ví dụ thứ 2 ( select a||', '||b from foo
) hoạt động cho bất kỳ loại dữ liệu nào kể từ khi ', '
mặc định chuỗi ký tự không được gõ text
thành kiểu làm cho toàn bộ biểu thức hợp lệ trong mọi trường hợp.
Đối với các kiểu dữ liệu không phải chuỗi, bạn có thể "sửa" câu lệnh thứ nhất bằng cách truyền ít nhất một đối số thành text
. ( Bất kỳ loại nào cũng có thể được sử dụng text
):
SELECT a::text || b AS ab FROM foo;
Đánh giá từ câu trả lời của riêng bạn , " không hoạt động " được cho là có nghĩa là " trả về NULL ". Kết quả của bất cứ điều gì được nối với NULL là NULL. Nếu các giá trị NULL có thể được tham gia và kết quả sẽ không phải là NULL, hãy sử dụng concat_ws()
để nối bất kỳ số lượng giá trị nào (Postgres 9.1 trở lên):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Hoặc concat()
nếu bạn không cần dấu phân cách:
SELECT concat(a, b) AS ab FROM foo;
Không cần kiểu phôi ở đây vì cả hai hàm đều "any"
nhập và làm việc với biểu diễn văn bản.
Thêm chi tiết (và tại sao COALESCE
là người thay thế kém) trong câu trả lời liên quan này:
+
không phải là toán tử hợp lệ cho nối chuỗi trong Postgres (hoặc SQL chuẩn). Đó là một ý tưởng riêng tư của Microsoft để thêm điều này vào các sản phẩm của họ.
Hầu như không có lý do chính đáng để sử dụng character(n)
(từ đồng nghĩa char(n)
:). Sử dụng text
hoặcvarchar
. Chi tiết:
text
loại khác ?