In MariaDB, CONCAT_WS()
è una funzione di stringa incorporata che sta per Concatenate With Separator.
CONCAT_WS()
esegue una concatenazione di stringhe sui suoi argomenti, con il primo argomento che funge da separatore per gli argomenti rimanenti.
La concatenazione è l'operazione di unione di due o più stringhe end-to-end.
CONCAT_WS()
accetta due o più argomenti (sebbene fornire solo due argomenti non comporterebbe la concatenazione di nulla, poiché il primo argomento è il separatore e il secondo è una singola stringa da concatenare con... nient'altro).
Sintassi
La sintassi è questa:
CONCAT_WS(separator,str1,str2,...)
Dove separator
è la stringa da utilizzare come separatore e str1, str2, …
rappresentano gli argomenti stringa per i quali concatenare.
Esempio
Ecco un esempio di base:
SELECT CONCAT_WS( ', ', 'Milk', 'Cheese', 'Bread');
Risultato:
+---------------------------------------------+ | CONCAT_WS( ', ', 'Milk', 'Cheese', 'Bread') | +---------------------------------------------+ | Milk, Cheese, Bread | +---------------------------------------------+
In questo caso, abbiamo concatenato tre stringhe usando una virgola e uno spazio come separatore.
Eccone un altro che utilizza un separatore diverso:
SELECT CONCAT_WS('-', 'Blue', 'Red', 'Green');
Risultato:
+----------------------------------------+ | CONCAT_WS('-', 'Blue', 'Red', 'Green') | +----------------------------------------+ | Blue-Red-Green | +----------------------------------------+
CONCAT_WS()
è simile a CONCAT()
funzione. Uno dei vantaggi di CONCAT_WS()
su CONCAT()
diventa evidente quando si concatenano molte stringhe.
Per fare l'esempio precedente con CONCAT()
, dovremmo ripetere il separatore tra ogni stringa.
In questo modo:
SELECT CONCAT('Blue', '-', 'Red', '-', 'Green');
Risultato:
+------------------------------------------+ | CONCAT('Blue', '-', 'Red', '-', 'Green') | +------------------------------------------+ | Blue-Red-Green | +------------------------------------------+
Questo potrebbe diventare ingombrante se avessimo molte stringhe da concatenare.
Nessun separatore
Fornire una stringa vuota come separatore concatena le stringhe senza un separatore:
SELECT CONCAT_WS('', 'Blue', 'Red', 'Green');
Risultato:
+---------------------------------------+ | CONCAT_WS('', 'Blue', 'Red', 'Green') | +---------------------------------------+ | BlueRedGreen | +---------------------------------------+
In questo caso otteniamo lo stesso risultato che otterremmo usando CONCAT()
per concatenare queste tre stringhe.
È importante fornire un separatore, anche se è vuoto. La mancata fornitura di un separatore comporterà l'utilizzo della prima stringa di concatenazione come separatore, che probabilmente non è quello che desideri.
Esempio:
SELECT CONCAT_WS('Blue', 'Red', 'Green', 'Orange');
Risultato:
+---------------------------------------------+ | CONCAT_WS('Blue', 'Red', 'Green', 'Orange') | +---------------------------------------------+ | RedBlueGreenBlueOrange | +---------------------------------------------+
In questo caso, Blue
è il primo argomento, quindi finisce per essere usato come separatore.
Concatenazione di argomenti nulli
Un altro vantaggio che CONCAT_WS()
ha più di CONCAT()
è che è null
-sicuro.
Se uno degli argomenti da concatenare è null
, CONCAT_WS()
li ignora. Il CONCAT()
funzione d'altra parte, restituisce null
(a meno che non sia in modalità Oracle, nel qual caso ignora null
argomenti).
Chiamiamo CONCAT_WS()
con un null
argomento:
SELECT CONCAT_WS('-', 'Blue', NULL, 'Green');
Risultato:
+---------------------------------------+ | CONCAT_WS('-', 'Blue', NULL, 'Green') | +---------------------------------------+ | Blue-Green | +---------------------------------------+
Come previsto, CONCAT_WS()
ha saltato l'argomento null e ha concatenato gli argomenti rimanenti.
Ciò significa che, se forniamo una stringa vuota come separatore, possiamo utilizzare CONCAT_WS()
come null
-versione sicura di CONCAT()
:
SELECT CONCAT_WS('', 'Blue', NULL, 'Green');
Risultato:
+--------------------------------------+ | CONCAT_WS('', 'Blue', NULL, 'Green') | +--------------------------------------+ | BlueGreen | +--------------------------------------+
Separatore nullo
Fornire un null
separatore è un'altra storia. In questo modo viene restituito null
.
SELECT CONCAT_WS(NULL, 'Blue', 'Red', 'Green');
Risultato:
+-----------------------------------------+ | CONCAT_WS(NULL, 'Blue', 'Red', 'Green') | +-----------------------------------------+ | NULL | +-----------------------------------------+
Stringhe binarie
Se uno qualsiasi degli argomenti è una stringa binaria, il risultato è una stringa binaria:
SELECT CONCAT_WS(', ', BINARY 'Apple', 'Orange');
Risultato:
+-------------------------------------------+ | CONCAT_WS(', ', BINARY 'Apple', 'Orange') | +-------------------------------------------+ | Apple, Orange | +-------------------------------------------+
Possiamo usare il COLLATION()
funzione per controllare la collazione del risultato:
SELECT COLLATION(CONCAT_WS(', ', BINARY 'Apple', 'Orange'));
Risultato:
+------------------------------------------------------+ | COLLATION(CONCAT_WS(', ', BINARY 'Apple', 'Orange')) | +------------------------------------------------------+ | binary | +------------------------------------------------------+
Se rimuoviamo il BINARY
operatore, otteniamo un risultato diverso:
SELECT COLLATION(CONCAT_WS(', ', 'Apple', 'Orange'));
Risultato:
+-----------------------------------------------+ | COLLATION(CONCAT_WS(', ', 'Apple', 'Orange')) | +-----------------------------------------------+ | utf8_general_ci | +-----------------------------------------------+
Singolo argomento
Chiamando CONCAT_WS()
con un solo argomento restituisce un errore:
SELECT CONCAT_WS('Blue');
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'CONCAT_WS'
Argomenti mancanti
Chiamando CONCAT_WS()
senza passare alcun argomento genera un errore:
SELECT CONCAT_WS();
Risultato:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'CONCAT_WS'