2011-03-08 1 views
21

Ho un indirizzo in più di una colonna in una tabella.Come concatenare correttamente le colonne usando T-SQL?

SELECT FirstName, LastName, StreetAddress, City, Country, PostalCode 
FROM Client 

sto cercando per concatenare colonne relativo indirizzo in uno depositata utilizzando virgola (,) come separatore ma se uno di colonna "es. City" è nullo o vuoto, virgola non dovrebbe essere lì.

Come utilizzare l'operatore ternario in TSQL come si ha in C#? Oppure suggerirmi le migliori pratiche?

Grazie

risposta

36

Quando si concatena qualcosa con un valore null, restituisce null. Quindi sto cercando di concatenare una virgola con il valore della colonna data e se quell'espressione restituisce null, io uso Coalesce per restituire una stringa vuota. Alla fine, se ottengo un valore, l'intero risultato inizierà con una virgola. Quindi rimuovo quella virgola usando la funzione Stuff.

Select Stuff(
    Coalesce(',' + FirstName,'') 
    + Coalesce(',' + LastName,'') 
    + Coalesce(',' + StreetAddress,'') 
    + Coalesce(',' + City,'') 
    + Coalesce(',' + Country,'') 
    + Coalesce(',' + PostalCode ,'') 
    , 1, 1, '') 
From Client 

Se si desidera solo l'indirizzo, poi, ovviamente, si sarebbe solo includere quelle colonne:

Select FirstName, LastName 
    , Stuff(
     Coalesce(',' + StreetAddress,'') 
     + Coalesce(',' + City,'') 
     + Coalesce(',' + Country,'') 
     + Coalesce(',' + PostalCode ,'') 
    , 1, 1, '') 
From Client 
+1

+1, ancora una volta appreso:) Ma dovresti rimuovere il primo/ultimo nome da quello perché penso che l'OP voglia solo concatenare l'indirizzo. –

4

Guarda isnull

È inoltre possibile guardare con funzione di COALESCE, si prega di cercarlo nella BOL:

Restituisce la prima espressione non nullo tra i suoi argomenti.

Infine un'altra cosa che potresti fare è usare una funzione CASE.

SELECT Address1, CASE Address2 IS NOT NULL THEN "," + Address2 ELSE... 
+1

'SELEZIONA City1 + ISNULL (City2)? "": "," City2 'non è sicuramente un TSQL valido. –

+1

@ Martin - Mi dispiace che fosse SSIS. Ma il resto dovrebbe essere valido. – JonH

1

È possibile utilizzare Case-Expression.

create table #Client(
FirstName varchar(20), 
LastName varchar(50), 
StreetAddress varchar(50), 
City varchar(20), 
Country varchar(20), 
PostalCode varchar(20) 
) 
insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Jeff','Bridges','Street1','City1','US','12345') 
insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Steven','Baldwin','Street2','City2','US','12345') 
insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Barack','Obama','Street3',NULL,'US','12345') 
insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Nora','Jones','Street4','City4','US','12345') 

SELECT FirstName, LastName, 
(CASE WHEN City IS NULL AND StreetAddress IS NULL THEN '' 
     WHEN City IS Null AND StreetAddress IS NOT NULL Then StreetAddress 
     WHEN City IS NOT Null AND StreetAddress IS NOT NULL THEN StreetAddress + ',' + City END 
)AS Adress, Country, PostalCode 
FROM #Client 

drop table #Client 
+0

@Grazie. Ma aggiungere tutte le colonne trovate (StreetAddress, City, Country, PostalCode) sono davvero difficili per me .. ?? Come userò questa dichiarazione CASE? – User13839404

+0

@User: utilizzare [soluzione Thomas] (http://stackoverflow.com/questions/5235391/how-to-concatenate-columns-properly-using-t-sql/5235783#5235783) –

0

Un'altra soluzione è quella di utilizzare ISNULL

Select FirstName, LastName 
    , ISNULL(StreetAddress+', ','') 
     +ISNULL(City+', ','') 
     +ISNULL(Country+', ','') 
     +ISNULL(PostalCode,'') 
FROM Client 

Se un valore è nullo, allora il risultato della concatenazione sarà nullo. ISNULL sostituirà la prima espressione con la seconda espressione.

http://msdn.microsoft.com/en-us/library/ms184325(v=SQL.90).aspx

24

Se si include la funzione NULLIF all'interno della funzione COALESCE che funzionerà correttamente per le colonne vuote così come NULL colonne

SELECT FirstName, 
     LastName, 
     STUFF(
      COALESCE(',' + NULLIF(StreetAddress, ''), '') + 
      COALESCE(',' + NULLIF(City, ''), '') + 
      COALESCE(',' + NULLIF(Country, ''), '') + 
      COALESCE(',' + NULLIF(PostalCode , ''), ''), 
      1, 1, '') AS "Address" 
    FROM Client 
+0

NULLIF, fantastico!Quindi è possibile aggiungere un LTRIM e RTRIM per rimuovere eventuali spazi bianchi per ottenere COALESCE (',' + NULLIF (RTRIM (LTRIM (StreetAddress)), ''), '') –