Chúng ta có thể sử dụng một số thủ thuật:
- Để bỏ qua
NULL
giá trị: COALESCE () - Để tránh dấu phân tách theo sau:hãy thêm nó vào trước mỗi mục, xóa dấu đầu tiên sau đó với ví dụ: STUFF ()
Anh ấy là một ví dụ làm việc :
CREATE TABLE foo (
id INT IDENTITY(1, 1) NOT NULL,
a VARCHAR(50),
b VARCHAR(50),
c VARCHAR(50),
d VARCHAR(50),
PRIMARY KEY (id)
);
INSERT INTO foo (a, b, c, d) VALUES ('a', 'b', 'c', 'd');
INSERT INTO foo (a, b, c, d) VALUES (NULL, 'b', NULL, 'd');
INSERT INTO foo (a, b, c, d) VALUES ('a', NULL, NULL, 'd');
INSERT INTO foo (a, b, c, d) VALUES (NULL, NULL, NULL, NULL);
SELECT id,
STUFF(
COALESCE('; ' + a, '') +
COALESCE('; ' + b, '') +
COALESCE('; ' + c, '') +
COALESCE('; ' + d, ''),
1, 2, '') AS bar
FROM foo
ORDER BY id
| ID | BAR |
|----|------------|
| 1 | a; b; c; d |
| 2 | b; d |
| 3 | a; d |
| 4 | (null) |
Mục đích của STUFF(..., 1, 2, '')
là xóa dấu phân tách ban đầu (2
là độ dài dấu phân cách trong trường hợp của chúng tôi).
Điều này sẽ hoạt động trên SQL Server 2005 (và có thể là các phiên bản trước đó).
Lưu ý:không giống như CONCAT_WS()
ban đầu , phiên bản của chúng tôi trả về NULL
khi tất cả các mục là NULL
. Thực lòng tôi nghĩ đó là một lựa chọn tốt hơn nhưng dù sao thì cũng nên dễ dàng thay đổi.