2011-02-10 2 views
8

Se in un'istruzione SELECT sto selezionando una stringa concatenata che utilizza i valori della tabella o delle tabelle da cui seleziono, qual è il modo migliore per gestire i valori NULL per quei valori in modo che ho ancora la mia stringa? Come in, se sto selezionando Città, Stato e Nazione per un utente, e voglio un terzo campo che li concatena tutti:T-SQL: Il modo migliore per gestire i valori NULL nella concatenazione di stringhe

SELECT City, State, Country, 
City + ', ' + State + ', ' + Country AS 'Location' 
FROM Users 

Tuttavia, 'Luogo' è NULL se uno dei tre campi è NULL (che si verifica ogni volta che l'utente non proviene dagli Stati Uniti).

mia soluzione attuale è questa:

SELECT City, State, Country, 
City + ', ' + COALESCE(State + ', ', '') + Country AS 'Location' 
FROM Users 

Ma non ero sicuro se questo era solo un hack e se c'è un modo molto migliore per farlo. Pensieri?

+2

'coalesce' è una pratica standard per questo. Nel tuo caso avresti solo bisogno di 'isnull' però. possibile duplicato di [SQL Server String Concatenation with Null] (http://stackoverflow.com/questions/2916791/sql-server-string-concatenation-with-null) btw – bzlm

+0

@bzlm Oops! Hai ragione. Non sono sicuro del motivo per cui non è comparso quando ho cercato o inserito il titolo. Forse perché ho messo specificamente "t-sql". Voto per chiudere. È sempre un po 'strano votare per chiudere la tua domanda. Fa il solletico. – JoeCool

+0

@bzlm La risposta alla domanda "duplicata" non mi eccita però. Non affronta i delimitatori tra le colonne. – RichardTheKiwi

risposta

13

Per cercare prevedibilmente corretto con virgole tra ogni due campi, è possibile utilizzare questo modulo

;with users(City, State, Country) as (
select 'a', null, 'c' union all 
select 'a', 'b', 'c' union all 
select null, null, 'c') 

-- ignore above this line 
SELECT City, State, Country, 
    STUFF(
     ISNULL(', ' + City, '')+ 
     ISNULL(', ' + State, '')+ 
     ISNULL(', ' + Country, ''), 1, 2, '') AS 'Location' 
FROM Users 

uscita

City State Country Location 
---- ----- ------- -------- 
a NULL c  a, c 
a b  c  a, b, c 
NULL NULL c  c 
+0

+1; non aveva considerato la possibilità che i valori medi fossero nulli, il che sembra piuttosto ovvio a posteriori. –

+0

@Adam God benedica 20/20 senno di poi! – RichardTheKiwi

+0

Sono un po 'confuso - le cose sopra "ignorano sopra questa linea" necessarie per il funzionamento della query? – JoeCool

2

Sì, questa è la strada da percorrere. Puoi anche usare isnull() ma la coalesce è più standard. Potresti considerare se potresti avere valori nulli in città o in paese. Potresti anche considerare che gli utenti potrebbero avere indirizzi multipli e potrebbero avere più di una città, stato, nazione e forse una tabella correlata sarebbe meglio per queste informazioni.

+1

Più standard? Citazione necessaria. – bzlm

+1

@bzlm: Anche se non mi spingerei così lontano da dire che è "più standard" (in termini di tasso di adozione), ma è generalmente la sintassi preferita per il nuovo sviluppo, dato che copre tutti i casi che copre 'ISNULL', così come altri (concatenando opzioni aggiuntive che avrebbero richiesto più istruzioni 'ISNULL', per esempio). Inoltre, 'COALESCE' è disponibile su SqlCE, mentre' ISNULL' no. –

+2

@Adam, @Bzlm a meno che non abbiamo a che fare con SQLCE, nessun punto che lo trascini fuori. Btw, COALESCE ha alcuni problemi di tipizzazione e prestazioni dinamici rispetto a IsNull, quindi se sei su SQL Server (non CE), e hai solo bisogno di 2 valori, non avventurarti in COALESCE inutilmente. – RichardTheKiwi

3

È possibile utilizzare la funzione Concat in SQL 2012 e in seguito

SELECT City, State, Country, 
Concat(City, ', ', State, ', ', Country) AS 'Location' 
FROM Users