В MariaDB, CONCAT_WS()
е вградена функция за низ, която означава Concatenate With Separator.
CONCAT_WS()
извършва конкатенация на низове върху своите аргументи, като първият аргумент е разделител за останалите аргументи.
Конкатенацията е операцията за свързване на два или повече низове от край до край.
CONCAT_WS()
приема два или повече аргумента (въпреки че предоставянето на само два аргумента би довело до нищо не свързано, тъй като първият аргумент е разделител, а вторият е единичен низ, който да бъде свързан с... нищо друго).
Синтаксис
Синтаксисът е така:
CONCAT_WS(separator,str1,str2,...)
Където separator
е низът, който ще се използва като разделител, и str1, str2, …
представляват низовите аргументи, за които да се конкатенира.
Пример
Ето един основен пример:
SELECT CONCAT_WS( ', ', 'Milk', 'Cheese', 'Bread');
Резултат:
+----------------------------------------------------+ | CONCAT_WS( ', ', 'Мляко', 'Сирене', 'Хляб') |+------------------------------ ---------------+| Мляко, сирене, хляб |+--------------------------------------------------- --+
В този случай съединихме три низа, използвайки запетая и интервал като разделител.
Ето още един, който използва различен разделител:
SELECT CONCAT_WS('-', 'Blue', 'Red', 'Green');
Резултат:
+---------------------------------------+| CONCAT_WS('-', 'Синьо', 'Червено', 'Зелено') |+------------------------------ ----------+| Синьо-Червено-Зелено |+---------------------------------------+предварително>
CONCAT_WS()
е подобен наCONCAT()
функция. Едно от предимствата наCONCAT_WS()
надCONCAT()
става очевидно при конкатениране на много низове.За да направите предишния пример с
CONCAT()
, ще трябва да повторим разделителя между всеки низ.Като това:
SELECT CONCAT('Blue', '-', 'Red', '-', 'Green');
Резултат:
+------------------------------------+| CONCAT('Синьо', '-', 'Червено', '-', 'Зелено') |+-------------------------- ----------------+| Синьо-червено-зелено |+---------------------------------------------------+Това може да стане тромаво, ако имахме много низове за конкатенация.
Без разделител
Предоставяне на празен низ, тъй като разделителят конкатенира низовете без разделител:
SELECT CONCAT_WS('', 'Blue', 'Red', 'Green');
Резултат:
+---------------------------------------+| CONCAT_WS('', 'Синьо', 'Червено', 'Зелено') |+------------------------------ --------+| BlueRedGreen |+------------------------------------------------+В този случай получаваме същия резултат, който бихме получили, когато използваме
CONCAT()
за да свържете тези три низа.Важно е да предоставите разделител, дори и да е празен. Ако не предоставите разделител, първият низ за конкатенация ще бъде използван като разделител, което вероятно не е това, което искате.
Пример:
SELECT CONCAT_WS('Blue', 'Red', 'Green', 'Orange');
Резултат:
+----------------------------------------------------+ | CONCAT_WS('Синьо', 'Червено', 'Зелено', 'Оранжево') |+------------------------------ ---------------+| ЧервеноСиньоЗеленоСиньоОранжево |+-----------------------------------------------------+предварително>В този случай
Blue
е първият аргумент и така в крайна сметка се използва като разделител.Конкатенация на нулеви аргументи
Друго предимство, което
CONCAT_WS()
има надCONCAT()
е, че еnull
-безопасно.Ако някой от аргументите, които трябва да бъдат конкатенирани, е
null
,CONCAT_WS()
ги игнорира.CONCAT()
функцията от друга страна връщаnull
(освен ако не е в режим на Oracle, в този случай игнорираnull
аргументи).Нека извикаме
CONCAT_WS()
сnull
аргумент:SELECT CONCAT_WS('-', 'Blue', NULL, 'Green');
Резултат:
+---------------------------------------+| CONCAT_WS('-', 'Синьо', NULL, 'Зелено') |+-------------------------------- -------+| Синьо-зелено |+------------------------------------------------+Както се очаква,
CONCAT_WS()
пропусна аргумента null и обедини останалите аргументи.Това означава, че ако предоставим празен низ като разделител, можем да използваме
CONCAT_WS()
катоnull
-безопасна версия наCONCAT()
:SELECT CONCAT_WS('', 'Blue', NULL, 'Green');
Резултат:
+----------------------------------------+| CONCAT_WS('', 'Синьо', NULL, 'Зелено') |+--------------------------------- -----+| BlueGreen |+----------------------------------------+Нулев разделител
Предоставяне на
null
разделител е друга история. Това връщаnull
.SELECT CONCAT_WS(NULL, 'Blue', 'Red', 'Green');
Резултат:
+-----------------------------------+| CONCAT_WS(NULL, 'Синьо', 'Червено', 'Зелено') |+-------------------------------- ---------+| NULL |+-----------------------------------+Двоични низове
Ако някой от аргументите е двоичен низ, резултатът е двоичен низ:
SELECT CONCAT_WS(', ', BINARY 'Apple', 'Orange');
Резултат:
+------------------------------------+| CONCAT_WS(', ', BINARY 'Apple', 'Orange') |+-------------------------------- ----------+| Ябълка, портокал |+---------------------------------------------------+предварително>Можем да използваме
COLLATION()
функция за проверка на съпоставянето на резултата:SELECT COLLATION(CONCAT_WS(', ', BINARY 'Apple', 'Orange'));
Резултат:
+------------------------------------------------------- --------+| COLLATION(CONCAT_WS(', ', BINARY 'Apple', 'Orange')) |+------------------------------ ------------------------+| двоичен |+-------------------------------------------------------- -------+Ако премахнем
BINARY
оператор, получаваме различен резултат:SELECT COLLATION(CONCAT_WS(', ', 'Apple', 'Orange'));
Резултат:
+------------------------------------------------------- -+| COLLATION(CONCAT_WS(', ', 'Ябълка', 'Оранжев')) |+------------------------------ ----------------+| utf8_general_ci |+------------------------------------------------------- +Единичен аргумент
Извикване на
CONCAT_WS()
само с един аргумент връща грешка:SELECT CONCAT_WS('Blue');
Резултат:
ГРЕШКА 1582 (42000):Неправилен брой на параметрите в извикването на естествена функция „CONCAT_WS“Липсващи аргументи
Извикване на
CONCAT_WS()
без подаване на аргументи води до грешка:SELECT CONCAT_WS();
Резултат:
ГРЕШКА 1582 (42000):Неправилен брой на параметрите в извикването на естествена функция „CONCAT_WS“