Trong MariaDB, CONCAT_WS()
là một hàm chuỗi tích hợp, viết tắt của Concatenate With Separator.
CONCAT_WS()
thực hiện nối chuỗi trên các đối số của nó, với đối số đầu tiên là dấu phân cách cho các đối số còn lại.
Nối là hoạt động nối hai hoặc nhiều chuỗi từ đầu đến cuối.
CONCAT_WS()
chấp nhận hai hoặc nhiều đối số (mặc dù chỉ cung cấp hai đối số sẽ dẫn đến không có gì được nối, do đối số đầu tiên là dấu phân cách và đối số thứ hai là một chuỗi đơn được nối với… không có gì khác).
Cú pháp
Cú pháp như sau:
CONCAT_WS(separator,str1,str2,...)
Nơi separator
là chuỗi được sử dụng làm dấu phân tách và str1, str2, …
đại diện cho các đối số chuỗi để nối.
Ví dụ
Đây là một ví dụ cơ bản:
SELECT CONCAT_WS( ', ', 'Milk', 'Cheese', 'Bread');
Kết quả:
+ --------------------------------------------- + | CONCAT_WS (',', 'Sữa', 'Phô mai', 'Bánh mì') | + ------------------------------ --------------- + | Sữa, Phô mai, Bánh mì | + ------------------------------------------- - +
Trong trường hợp này, chúng tôi đã nối ba chuỗi bằng cách sử dụng dấu phẩy và dấu cách làm dấu phân tách.
Đây là một cái khác sử dụng dấu phân tách khác:
SELECT CONCAT_WS('-', 'Blue', 'Red', 'Green');
Kết quả:
+ ---------------------------------------- + | CONCAT_WS ('-', 'Xanh lam', 'Đỏ', 'Xanh lục') | + ------------------------------ ---------- + | Blue-Red-Green | + ---------------------------------------- +
CONCAT_WS()
tương tự nhưCONCAT()
hàm số. Một trong những lợi ích củaCONCAT_WS()
quaCONCAT()
trở nên rõ ràng khi nối nhiều chuỗi.Để thực hiện ví dụ trước với
CONCAT()
, chúng tôi cần lặp lại dấu phân cách giữa mỗi chuỗi.Như thế này:
SELECT CONCAT('Blue', '-', 'Red', '-', 'Green');
Kết quả:
+ ------------------------------------------ + | CONCAT ('Xanh lam', '-', 'Đỏ', '-', 'Xanh lục') | + -------------------------- ---------------- + | Blue-Red-Green | + ------------------------------------------ +Điều này có thể khó sử dụng nếu chúng ta có nhiều chuỗi để nối.
Không có dấu phân tách
Cung cấp một chuỗi trống khi dấu phân tách nối các chuỗi không có dấu phân tách:
SELECT CONCAT_WS('', 'Blue', 'Red', 'Green');
Kết quả:
+ --------------------------------------- + | CONCAT_WS ('', 'Xanh lam', 'Đỏ', 'Xanh lục') | + ------------------------------- -------- + | BlueRedGreen | + --------------------------------------- +Trong trường hợp này, chúng tôi nhận được kết quả tương tự khi sử dụng
CONCAT()
để nối ba chuỗi đó.Điều quan trọng là phải cung cấp một dấu phân cách, ngay cả khi nó trống. Không cung cấp dấu phân tách sẽ dẫn đến chuỗi nối đầu tiên được sử dụng làm dấu phân tách, đây có thể không phải là điều bạn muốn.
Ví dụ:
SELECT CONCAT_WS('Blue', 'Red', 'Green', 'Orange');
Kết quả:
+ --------------------------------------------- + | CONCAT_WS ('Xanh lam', 'Đỏ', 'Xanh lá cây', 'Cam') | + ------------------------------ --------------- + | RedBlueGreenBlueOrange | + --------------------------------------------- +Trong trường hợp này,
Blue
là đối số đầu tiên và vì vậy nó sẽ được sử dụng làm dấu phân cách.Nối các đối số rỗng
Một lợi ích khác mà
CONCAT_WS()
có hơnCONCAT()
đó có phải lànull
không -an toàn.Nếu bất kỳ đối số nào được nối là
null
,CONCAT_WS()
bỏ qua chúng.CONCAT()
mặt khác, trả vềnull
(trừ khi nó ở chế độ Oracle, trong trường hợp đó nó bỏ quanull
đối số).Hãy gọi
CONCAT_WS()
vớinull
đối số:SELECT CONCAT_WS('-', 'Blue', NULL, 'Green');
Kết quả:
+ --------------------------------------- + | CONCAT_WS ('-', 'Blue', NULL, 'Green') | + -------------------------------- ------- + | Blue-Green | + --------------------------------------- +Như mong đợi,
CONCAT_WS()
bỏ qua đối số null và nối các đối số còn lại.Điều này có nghĩa là, nếu chúng tôi cung cấp một chuỗi trống làm dấu phân tách, chúng tôi có thể sử dụng
CONCAT_WS()
dưới dạngnull
-phiên bản an toàn củaCONCAT()
:SELECT CONCAT_WS('', 'Blue', NULL, 'Green');
Kết quả:
+ -------------------------------------- + | CONCAT_WS ('', 'Blue', NULL, 'Green') | + -------------------------------------------------- ----- + | BlueGreen | + -------------------------------------- +Dấu phân cách rỗng
Cung cấp
null
phân cách là một câu chuyện khác. Thao tác này trả vềnull
.SELECT CONCAT_WS(NULL, 'Blue', 'Red', 'Green');
Kết quả:
+ ----------------------------------------- + | CONCAT_WS (NULL, "Blue", "Red", "Green") | + -------------------------------- --------- + | NULL | + ----------------------------------------- +Chuỗi nhị phân
Nếu bất kỳ đối số nào là chuỗi nhị phân, kết quả là chuỗi nhị phân:
SELECT CONCAT_WS(', ', BINARY 'Apple', 'Orange');
Kết quả:
+ ------------------------------------------- + | CONCAT_WS (',', BINARY 'Apple', 'Orange') | + --------------------------------- ---------- + | Apple, Orange | + ------------------------------------------- +Chúng ta có thể sử dụng
COLLATION()
chức năng kiểm tra sự đối chiếu của kết quả:SELECT COLLATION(CONCAT_WS(', ', BINARY 'Apple', 'Orange'));
Kết quả:
+ ---------------------------------------------- -------- + | COLLATION (CONCAT_WS (',', BINARY 'Apple', 'Orange')) | + ------------------------------ ------------------------ + | nhị phân | + ----------------------------------------------- ------- +Nếu chúng tôi xóa
BINARY
toán tử, chúng tôi nhận được một kết quả khác:SELECT COLLATION(CONCAT_WS(', ', 'Apple', 'Orange'));
Kết quả:
+ ---------------------------------------------- - + | COLLATION (CONCAT_WS (',', 'Apple', 'Orange')) | + ------------------------------- ---------------- + | utf8_general_ci | + ----------------------------------------------- +Đối số đơn
Đang gọi
CONCAT_WS()
chỉ với một đối số trả về lỗi:SELECT CONCAT_WS('Blue');
Kết quả:
ERROR 1582 (42000):Số lượng tham số không chính xác trong lệnh gọi hàm gốc 'CONCAT_WS'Thiếu đối số
Đang gọi
CONCAT_WS()
mà không chuyển bất kỳ đối số nào dẫn đến lỗi:SELECT CONCAT_WS();
Kết quả:
ERROR 1582 (42000):Số lượng tham số không chính xác trong lệnh gọi hàm gốc 'CONCAT_WS'