Với các cột kiểu chuỗi như character(2)
(như bạn đã đề cập ở phần sau), nối được hiển thị chỉ hoạt động bởi vì, trích dẫn hướng dẫn sử dụng:
[...] toán tử nối chuỗi (
||
) chấp nhận đầu vào không phải chuỗi, miễn là ít nhất một đầu vào thuộc loại chuỗi , như thể hiện trong Bảng 9.8. Đối với các trường hợp khác, hãy chèn một sự ép buộc rõ ràng vàotext
[...]
Tôi nhấn mạnh đậm. Ví dụ thứ 2 (select a||', '||b from foo
) hoạt động cho bất kỳ kiểu dữ liệu kể từ chuỗi không định kiểu, chữ ', '
mặc định nhập text
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 chữa" câu lệnh đầu tiên bằng cách truyền ít nhất một đối số thành text
. ( Bất kỳ loại có thể được chuyển thành 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ì nối với NULL là NULL. Nếu KHÔNG ĐỦ các giá trị có thể tham gia và kết quả không được 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;
Dấu phân tách chỉ được thêm vào giữa các giá trị không rỗng, tức là chỉ khi cần thiết.
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;
Ở đây không cần loại phôi vì cả hai hàm đều lấy "any"
nhập và làm việc với các biểu diễn văn bản.
Thêm chi tiết (và lý do tại sao COALESCE
là một chất thay thế kém) trong câu trả lời có liên quan này:
- Kết hợp hai cột và thêm vào một cột mới
Về cập nhật trong nhận xét
+
không phải là một toán tử hợp lệ để nối chuỗi trong Postgres (hoặc SQL tiêu chuẩn). Đó là ý tưởng riêng của Microsoft khi thêm điều này vào các sản phẩm của họ.
Hầu như không có bất kỳ lý do chính đáng nào để sử dụng (từ đồng nghĩa:character(n)
). Sử dụng char(n)
text
hoặc varchar
. Chi tiết:
- Bất kỳ nhược điểm nào của việc sử dụng kiểu dữ liệu "văn bản" để lưu trữ chuỗi?
- Cách tốt nhất để kiểm tra "giá trị trống hoặc rỗng"