Il problema evidenziato risiede nel fatto che se una delle stringhe che si vogliono concatenare è NULL
la funzione restituirà NULL
:
Quindi, se la nostra tabella contiene un campo che può essere NULL, la concatenazione di tale campo potrebbe non fornire il risultato desiderato.
MariaDB > SELECT CONCAT(NULL,'stringa 1','stringa 2');Al contrario una concatenazione con una stringa vuota si comporta come ci si attende:
+--------------------------------------+
| CONCAT(NULL,'stringa1','stringa2') |
+--------------------------------------+
| NULL |
+--------------------------------------+
1 row in set (0.00 sec)
MariaDB > SELECT CONCAT('','stringa1','stringa2');
+------------------------------------+
| CONCAT('','stringa1','stringa2') |
+------------------------------------+
| stringa1stringa2 |
+------------------------------------+
1 row in set (0.00 sec)
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');Il trucco consiste nell'utilizzare come separatore la stringa vuota ed in questo caso il campo NULL non ci darà più problemi:
+-----------------------------------------+
| CONCAT_WS (';','stringa1','stringa2') |
+-----------------------------------------+
| stringa1;stringa2 |
+-----------------------------------------+
1 row in set (0.00 sec)
MariaDB > SELECT CONCAT_WS('','stringa1','stringa2',NULL);
+--------------------------------------------+
| CONCAT_WS('','stringa1','stringa2',NULL) |
+--------------------------------------------+
| stringa1stringa2 |
+--------------------------------------------+
1 row in set (0.00 sec)