L'istruzione CONCAT in MySQL (MariaDB) restituisce stranamente un valore nullo

08 ottobre 2015

​Il problema evidenziato risiede nel fatto che se una delle stringhe che si vogliono concatenare è NULL la funzione restituirà NULL :
MariaDB > SELECT CONCAT(NULL,'stringa 1','stringa 2');
+--------------------------------------+
| CONCAT(NULL,'stringa1','stringa2') |
+--------------------------------------+
| NULL |
+--------------------------------------+
1 row in set (0.00 sec)
Al contrario una concatenazione con una stringa vuota si comporta come ci si attende:
MariaDB > SELECT CONCAT('','stringa1','stringa2');
+------------------------------------+
| CONCAT('','stringa1','stringa2') |
+------------------------------------+
| stringa1stringa2 |
+------------------------------------+
1 row in set (0.00 sec) 
​Quindi, se la nostra tabella contiene un campo che può essere NULL, la concatenazione di tale campo potrebbe non fornire il risultato desiderato.
Uno tra i possibili trucchi per ovviare al problema è utilizzare la funzione CONCAT_WS al posto di CONCAT. Il nome di tale funzione significa "concat with separator" e prevede come primo argomento un separatore da utilizzare tra le stringhe da concatenare.
Ad es. se vogliamo separare con il punto e virgola le stringhe:
MariaDB > SELECT CONCAT_WS (';','stringa1','stringa2');
+-----------------------------------------+
| CONCAT_WS (';','stringa1','stringa2') |
+-----------------------------------------+
| stringa1;stringa2                      |
+-----------------------------------------+
1 row in set (0.00 sec)
Il trucco consiste nell'utilizzare come separatore la stringa vuota ed in questo caso il campo NULL non ci darà più problemi:
MariaDB > SELECT CONCAT_WS('','stringa1','stringa2',NULL); 
+--------------------------------------------+
| CONCAT_WS('','stringa1','stringa2',NULL) |
+--------------------------------------------+
| stringa1stringa2                          |
+--------------------------------------------+
1 row in set (0.00 sec)