2011-03-08 11 views
21

Tengo una dirección en más de una columna en una tabla.¿Cómo concatenar columnas correctamente utilizando T-SQL?

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

Estoy intentando concatenar dirección columnas relacionadas presentada en uno utilizando la coma (,) como separador, pero si cualquiera de la columna "por ejemplo. City" es nulo o vacío, coma no debería estar allí.

Cómo utilizar operador ternario en TSQL como uno tiene en C#? O sugiérame las mejores prácticas?

Gracias

Respuesta

36

Cuando concatenas algo con nulo, devuelve nulo. Así que estoy tratando de concatenar una coma con el valor de columna dado y si esa expresión devuelve nulo, utilizo Coalesce para devolver una cadena vacía. Al final, si obtengo un valor, el resultado completo comenzará con una coma. Entonces elimino esa coma usando la función de Relleno.

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

Si sólo desea que la dirección, entonces, evidentemente, habría sólo incluyen aquellas columnas:

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

1, de nuevo algo aprendido:) Pero debe eliminar el primer/apellido de eso porque creo que el OP solo desea concatenar la dirección. –

4

Mira isnull

También puede buscar en el uso función COALESCE, por favor búsquelo en BOL:

Devuelve la primera expresión no nula entre sus argumentos.

Finalmente, otra cosa que podría hacer es usar una función CASE.

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

SELECT City1 + ISNULL (City2)? "": "," City2 'definitivamente no es válido TSQL. –

+1

@Martin - Disculpa que fue SSIS. Pero el resto debe ser válido. – JonH

1

Usted podría utilizar 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

@Gracias. Pero agregar todas las columnas encontradas (StreetAddress, City, Country, PostalCode) es realmente difícil para mí ... ?? ¿Cómo voy a usar esta declaración CASE? – User13839404

+0

@user: utilizar [solución Thomas] (http://stackoverflow.com/questions/5235391/how-to-concatenate-columns-properly-using-t-sql/5235783#5235783) –

0

Otra solución es utilizar ISNULL

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

Si un valor es nulo, el resultado de la concatenación será nulo. ISNULL reemplazará la primera expresión con la segunda expresión.

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

24

Si se incluye la función NULLIF dentro de la función COALESCE que funcionará correctamente para las columnas vacías, así como NULL columnas

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

NULLIF, ¡genial!Luego, podría agregar un LTRIM y RTRIM para eliminar cualquier espacio en blanco para obtener COALESCE (',' + NULLIF (RTRIM (LTRIM (StreetAddress)), ''), '' –

Cuestiones relacionadas