MySQL CONCAT restituisce NULL se un campo contiene NULL


163

Ho i seguenti dati nella mia tabella "dispositivi"

affiliate_name  affiliate_location  model     ip             os_type    os_version 

cs1             inter               Dell     10.125.103.25   Linux      Fedora  
cs2             inter               Dell     10.125.103.26   Linux      Fedora  
cs3             inter               Dell     10.125.103.27   NULL       NULL    
cs4             inter               Dell     10.125.103.28   NULL       NULL    

Ho eseguito sotto query

SELECT CONCAT(`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) AS device_name
FROM devices

Restituisce il risultato indicato di seguito

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
(NULL)
(NULL)

Come uscire da questo in modo che dovrebbe ignorare NULL AND il risultato dovrebbe essere

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
cs3-Dell-10.125.103.27-
cs4-Dell-10.125.103.28-

Risposte:


280

converti i NULLvalori con una stringa vuota avvolgendolaCOALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices

1
È possibile utilizzare se si seleziona CONCAT (if (nome_affiliazione è null, '', nome_affiliazione), '-', if (modello è null, '', nome_affiliazione)) come modello dai dispositivi
Dinesh Rabara

6
Per quelli che si chiedono, come ho fatto, cosa fa la COALESCEfunzione: restituisce il primo NULLparametro senza valore passato ad essa (o NULLse tutti i parametri lo sono NULL). Passando una stringa vuota come secondo parametro, si garantisce che non tornerà NULL.
Jo.

3
mysql ha IFNULL (arg, default) invece COALESCE con la stessa sintassi
Vasilii Suricov

126

Utilizzare invece CONCAT_WS :

CONCAT_WS () non salta le stringhe vuote. Tuttavia, salta qualsiasi valore NULL dopo l'argomento separatore.

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices

Mi dispiace neeraj ho perso il '_' tra Concat e WS Per favore riprova con CONCAT_WS (). Ho aggiornato la risposta per favore controlla,
Gurmeet

8
Nota che questa soluzione nasconde una "colonna" completa (incluso il separatore) se uno dei campi centrali è NULL. Quindi questa risposta è corretta solo supponendo che solo gli ultimi campi possano essere NULL. A seconda delle tue necessità, la risposta COALEASE () di seguito potrebbe essere migliore.
Jannes,

Funziona solo se vuoi che ogni membro sia separato dallo stesso separatore. CONCAT non ha questa limitazione. Ho pubblicato la soluzione come risposta qui
patrick,

12

Per avere la stessa flessibilità in CONCAT_WS di CONCAT (se non si desidera lo stesso separatore tra tutti i membri, ad esempio), utilizzare quanto segue:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)

11
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices

15
in mysql IFNULL () invece di ISNULL ()
Jeffrey Nicholson Carré,

11

CONCAT_WSproduce ancora null per me se il primo campo è Null. Ho risolto questo aggiungendo una stringa di lunghezza zero all'inizio come in

CONCAT_WS("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`)

però

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 

produce Null quando il primo campo è Null.


ovviamente, perché il primo campo è la stringa con cui si concatenerà (WS = con stringa)
Bouke Versteegh

2
CONCAT_WS è l'abbreviazione di Concatenate With Separator. Il primo parametro è il separatore e non può essere nullo. Questo è probabilmente quello che vuoi invece:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest

2

puoi usare l'istruzione if come di seguito

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.