2013-04-01 8 views
95

ho seguenti dati in mio tavolo "dispositivi"MySQL CONCAT restituisce NULL se qualsiasi campo contiene NULL

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 interrogazione

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

restituisce risultato riportato qui 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 debba ignorare NULL E 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- 

risposta

157

convertire i valori NULL con stringa vuota avvolgendolo in COALESCE

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

La soluzione ha funzionato ma contiene una buona quantità di codice. Comunque l'altra soluzione data da Gerry contiene meno codice ... non importa :) – neeraj

+5

Questa risposta è totalmente migliore però, amico. Duuuude! – Ben

+1

Questa risposta è molto più flessibile di quella selezionata +1 – etherous

87

Uso CONCAT_WS invece:

CONCAT_WS() non salta stringhe vuote. Tuttavia, salta tutti i valori NULL dopo l'argomento separatore.

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

Ho ricevuto un errore .... FUNCTION siteconfig_development.CONCATWS non esiste – neeraj

+1

@neeraj usa CONCAT_WS() controlla una semplice demo http://sqlfiddle.com/#!2/d41d8/9885 – swapnesh

+0

+1 per un risultato migliore che esclude - suffisso. – neeraj

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

in mysql IFNULL() invece di ISNULL() – bleuscyther

+0

Eccellente! Ha funzionato come un fascino, @bleuscyther! –

1

CONCAT_WS produce ancora nulla per me, se il primo campo è Null. Ho risolto questo problema aggiungendo all'inizio una stringa di lunghezza zero come in CONCAT_WS ("", affiliate_name, "-", model, "-", ip, "-", os_type, "-", os_version) tuttavia CONCAT ("" , affiliate_name, '-', model, '-', ip, '-', os_type, '-', os_version) produce Null quando il primo campo è Null.

+0

La soluzione data da Gerry ha funzionato perfettamente per me. – neeraj

+0

ovviamente, perché il primo campo è la stringa con cui verrà concatenato (WS = con stringa) –

+1

CONCAT_WS è l'abbreviazione di Concatena con separatore. 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

4

di avere la stessa flessibilità di CONCAT_WS come in CONCAT (se non si desidera che la stessa separatore tra ogni membro, per esempio), utilizzare la seguente:

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

è possibile utilizzare if come qui di seguito

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices