2011-10-13 9 views
17

Nella parte di codice seguente, sto creando un campo Indirizzo concatenando varie parti di un indirizzo.CONCAT condizionale con valori potenzialmente NULL o vuoti

Tuttavia, se ad esempio address2 era vuoto, il trailing , sarà ancora concatenato in Indirizzo.

Ciò significa che se tutti i campi erano vuoti, il risultato è ,,,,.

Se address1 è "House Number" e tutto il resto è vuoto, si termina con House Number,,,,.

CONCAT(COALESCE(address1,'') , ', ' , 
     COALESCE(address2,'') , ', ' , 
     COALESCE(address3,'') , ', ' , 
     COALESCE(city,'')  , ', ' , 
     COALESCE(zip, '') 
) AS Address, 

C'è qualche modo di porre condizionale le virgole tra parti di indirizzo solo se il contenuto di una parte di indirizzo non è vuoto.

Come qualcosa sulla falsariga di (pseudo-codice) IF(address1) is NULL use '' ELSE use ','

Grazie.

risposta

24

Dai un'occhiata alla funzione CONCAT_WS. Fa esattamente quello che vuoi.

+0

Grazie, questo è esattamente ciò di cui avevo bisogno. – Houdmont

+0

Bello avere il link ai documenti. – bloodyKnuckles

3

Utilizzando CONCAT_WS come dice Mat è una buona idea, ma ho pensato di farlo un modo diverso, con disordinato IF() dichiarazioni:

CONCAT(COALESCE(address1,''), IF(LENGTH(address1), ', ', ''), 
     COALESCE(address2,''), IF(LENGTH(address2), ', ', ''), 
     COALESCE(address3,''), IF(LENGTH(address3), ', ', ''), 
     COALESCE(city,''), IF(LENGTH(city), ', ', ''), 
     COALESCE(zip,''), IF(LENGTH(address1), ', ', ''), 
) AS Address, 

Il IF() s verifica se il campo ha una lunghezza e se così restituisce una virgola. Altrimenti, restituisce una stringa vuota.

+0

Grazie per il suggerimento, questo funziona bene, ma come si fa notare, l'uso di CONCAT_WS è ancora più semplice, quindi mi sono bloccato. – Houdmont

26
CONCAT_WS(', ', 
     IF(LENGTH(`address1`),`address1`,NULL), 
     IF(LENGTH(`address2`),`address2`,NULL), 
     IF(LENGTH(`address3`),`address3`,NULL), 
     IF(LENGTH(`city`),`city`,NULL), 
     IF(LENGTH(`zip`),`zip`,NULL) 
) 
+1

Questa soluzione è elegante. L'uso della funzione LENGTH per restituire NULL, che gestisce con garbo la situazione in cui è presente una stringa vuota.Una stringa vuota non è NULL, quindi concat_ws includerebbe erroneamente un delimitatore davanti a stringhe vuote. Molto bella! – kd4ttc

+1

E da un utente @ Martin che ha risposto a una sola domanda su StackOverflow, con solo 11 punti reputazione. Sono umiliato. – kd4ttc

+0

Grazie mille. Esattamente quello che stavo cercando. risparmiato molto tempo – Saurabh

3

provare con MAKE_SET

SELECT MAKE_SET(11111,`address1`,`address2`,`address3`,`city`,`zip`) AS Address 

Sarà restituisce una stringa con tutto il valore NOT NULL separati da ,

0

Come chiaramente indicato nelle doc che:

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

Possiamo rimuovere gli spazi vuoti da NULL elegantemente gestita da CONCAT_WS.

CONCAT_WS(', ', 
     IF(`address1` != '', `address1`, NULL), 
     IF(`address2` != '', `address2`, NULL), 
     IF(`address3` != '', `address3`, NULL), 
     IF(`city` != '', `city, NULL), 
     IF(`zip` != '', `zip, NULL) 
) 
Problemi correlati