¿Cómo concatenar columnas correctamente usando T-SQL?


Tengo una dirección en más de una columna en una tabla.

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

Estoy tratando de concatenar las columnas relacionadas con la dirección en una archivada usando Coma (,) como separador pero si alguna de la columna "eg. Ciudad " es nula o vacía, la coma no debe estar allí.

¿Cómo usar el operador ternario en TSQL como uno tiene en c#? ¿O sugerirme la mejor práctica?

Gracias

Author: User13839404, 2011-03-08

5 answers

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

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

Si solo desea la dirección, entonces obviamente solo incluiría esas columnas:

Select FirstName, LastName
    , Stuff(
        Coalesce(',' + StreetAddress,'')
        + Coalesce(',' + City,'')
        + Coalesce(',' + Country,'')
        + Coalesce(',' + PostalCode ,'')
    , 1, 1, '')
From Client
 37
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-08 17:25:43

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

SELECT FirstName,
       LastName,
       STUFF(
           COALESCE(',' + NULLIF(StreetAddress, ''), '')  + 
           COALESCE(',' + NULLIF(City, ''), '') +
           COALESCE(',' + NULLIF(Country, ''), '') +
           COALESCE(',' + NULLIF(PostalCode , ''), ''),
           1, 1, '') AS "Address"
   FROM Client
 25
Author: Edward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-13 17:06:38

Mira a isnull

También puedes ver el uso de la función COALESCE, por favor búscalo en BOL:

Devuelve la primera expresión nonnull 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...
 4
Author: JonH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-08 17:27:25

Podría usar Expresión de mayúsculas y minúsculas.

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
 1
Author: Tim Schmelter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-08 16:57:38

Otra solución es usar ISNULL

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

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

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

 0
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-08 21:38:15