V MariaDB, CONCAT_WS()
je vestavěná funkce řetězce, která znamená Concatenate With Separator.
CONCAT_WS()
provede u svých argumentů zřetězení řetězců, přičemž první argument je oddělovač pro zbývající argumenty.
Zřetězení je operace spojování dvou nebo více řetězců end-to-end.
CONCAT_WS()
přijímá dva nebo více argumentů (ačkoli poskytnutí pouze dvou argumentů by vedlo k tomu, že by se nic nezřetězovalo, protože první argument je oddělovač a druhý je jeden řetězec, s nímž se má spojit... nic jiného).
Syntaxe
Syntaxe vypadá takto:
CONCAT_WS(separator,str1,str2,...)
Kde separator
je řetězec, který se má použít jako oddělovač, a str1, str2, …
představují argumenty řetězce, pro které se mají zřetězit.
Příklad
Zde je základní příklad:
SELECT CONCAT_WS( ', ', 'Milk', 'Cheese', 'Bread');
Výsledek:
+---------------------------------------------+ | CONCAT_WS( ', ', 'Mléko', 'Sýr', 'Chléb') |+------------------------------- ----------------+| Mléko, sýr, chléb |+------------------------------------------- --+
V tomto případě jsme zřetězili tři řetězce pomocí čárky a mezery jako oddělovače.
Zde je další, který používá jiný oddělovač:
SELECT CONCAT_WS('-', 'Blue', 'Red', 'Green');
Výsledek:
+----------------------------------------+| CONCAT_WS('-', 'Modrá', 'Červená', 'Zelená') |+------------------------------ ----------+| Modrá-Červená-Zelená |+----------------------------------------+
CONCAT_WS()
je podobnýCONCAT()
funkce. Jedna z výhodCONCAT_WS()
přesCONCAT()
se projeví při zřetězení mnoha řetězců.Chcete-li provést předchozí příklad pomocí
CONCAT()
, museli bychom opakovat oddělovač mezi každým řetězcem.Takhle:
SELECT CONCAT('Blue', '-', 'Red', '-', 'Green');
Výsledek:
+------------------------------------------+| CONCAT('Modrá', '-', 'Červená', '-', 'Zelená') |+-------------------------- -----------------+| Modrá-Červená-Zelená |+------------------------------------------+To by mohlo být nepraktické, pokud bychom měli mnoho řetězců ke zřetězení.
Bez oddělovače
Zadáním prázdného řetězce jako oddělovače zřetězíte řetězce bez oddělovače:
SELECT CONCAT_WS('', 'Blue', 'Red', 'Green');
Výsledek:
+---------------------------------------+| CONCAT_WS('', 'Modrá', 'Červená', 'Zelená') |+------------------------------- --------+| BlueRedGreen |+---------------------------------------+V tomto případě dostaneme stejný výsledek, jaký bychom dostali při použití
CONCAT()
zřetězit tyto tři řetězce.Je důležité poskytnout oddělovač, i když je prázdný. Pokud nezadáte oddělovač, bude jako oddělovač použit první řetězec zřetězení, což pravděpodobně není to, co chcete.
Příklad:
SELECT CONCAT_WS('Blue', 'Red', 'Green', 'Orange');
Výsledek:
+---------------------------------------------+ | CONCAT_WS('Modrá', 'Červená', 'Zelená', 'Oranžová') |+------------------------------- ----------------+| RedBlueGreenBlueOrange |+---------------------------------------------+V tomto případě
Blue
je první argument, a tak se nakonec použije jako oddělovač.Zřetězení nulových argumentů
Další výhodou je
CONCAT_WS()
má více nežCONCAT()
je, že jenull
-bezpečný.Pokud je některý z argumentů, které mají být zřetězeny,
null
,CONCAT_WS()
ignoruje je.CONCAT()
funkce na druhé straně vracínull
(pokud to není v režimu Oracle, v takovém případě ignorujenull
argumenty).Zavolejte
CONCAT_WS()
snull
argument:SELECT CONCAT_WS('-', 'Blue', NULL, 'Green');
Výsledek:
+---------------------------------------+| CONCAT_WS('-', 'Modrá', NULL, 'Zelená') |+-------------------------------- -------+| Modro-zelená |+---------------------------------------+Podle očekávání
CONCAT_WS()
přeskočil argument null a zřetězil zbývající argumenty.To znamená, že pokud zadáme prázdný řetězec jako oddělovač, můžeme použít
CONCAT_WS()
jakonull
-bezpečná verzeCONCAT()
:SELECT CONCAT_WS('', 'Blue', NULL, 'Green');
Výsledek:
+--------------------------------------+| CONCAT_WS('', 'Modrá', NULL, 'Zelená') |+--------------------------------- -----+| BlueGreen |+--------------------------------------+Nulový oddělovač
Poskytnutí
null
separátor je jiný příběh. Tím se vrátínull
.SELECT CONCAT_WS(NULL, 'Blue', 'Red', 'Green');
Výsledek:
+-----------------------------------------+| CONCAT_WS(NULL, 'Modrá', 'Červená', 'Zelená') |+-------------------------------- ---------+| NULL |+-----------------------------------------+Binární řetězce
Pokud je některý z argumentů binární řetězec, výsledkem je binární řetězec:
SELECT CONCAT_WS(', ', BINARY 'Apple', 'Orange');
Výsledek:
+-------------------------------------------+| CONCAT_WS(', ', BINARY 'Apple', 'Oranžová') |+--------------------------------- ----------+| Apple, Orange |+-------------------------------------------+Můžeme použít
COLLATION()
funkce pro kontrolu seřazení výsledku:SELECT COLLATION(CONCAT_WS(', ', BINARY 'Apple', 'Orange'));
Výsledek:
+---------------------------------------------- --------+| COLLATION(CONCAT_WS(', ', BINARY 'Apple', 'Oranžová')) |+------------------------------ -------------------------+| binární |+----------------------------------------------- -------+Pokud odstraníme
BINARY
operátor, dostaneme jiný výsledek:SELECT COLLATION(CONCAT_WS(', ', 'Apple', 'Orange'));
Výsledek:
+---------------------------------------------- -+| COLLATION(CONCAT_WS(', ', 'Apple', 'Oranžová')) |+------------------------------- -----------------+| utf8_general_ci |+----------------------------------------------- +Jeden argument
Volání
CONCAT_WS()
pouze s jedním argumentem vrátí chybu:SELECT CONCAT_WS('Blue');
Výsledek:
CHYBA 1582 (42000):Nesprávný počet parametrů ve volání nativní funkce 'CONCAT_WS'Chybí argumenty
Volání
CONCAT_WS()
bez předání jakýchkoli argumentů dojde k chybě:SELECT CONCAT_WS();
Výsledek:
CHYBA 1582 (42000):Nesprávný počet parametrů ve volání nativní funkce 'CONCAT_WS'