Как правильно объединить столбцы с помощью T-SQL? - PullRequest
22 голосов
/ 08 марта 2011

У меня есть адрес в нескольких столбцах таблицы.

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

Я пытаюсь объединить столбцы, связанные с адресами, в один файл, используя запятую (,) в качестве разделителя, но если какой-либо из столбцов «например, Город» равен нулю или пуст, запятая не должна присутствовать.

Как использовать троичный оператор в TSQL, как в c #?Или предложить мне лучшую практику?

Спасибо

Ответы [ 6 ]

38 голосов
/ 08 марта 2011

Когда вы объединяете что-либо с нулем, оно возвращает ноль. Поэтому я пытаюсь объединить запятую с заданным значением столбца, и если это выражение возвращает ноль, я использую Coalesce для возврата пустой строки. В конце, если я получу значение, весь результат будет начинаться с запятой. Поэтому я удаляю эту запятую с помощью функции Stuff.

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

Если вам нужен только адрес, то, очевидно, вы бы включили только эти столбцы:

Select FirstName, LastName
    , Stuff(
        Coalesce(',' + StreetAddress,'')
        + Coalesce(',' + City,'')
        + Coalesce(',' + Country,'')
        + Coalesce(',' + PostalCode ,'')
    , 1, 1, '')
From Client
28 голосов
/ 06 апреля 2011

Если вы включите функцию NULLIF в функцию COALESCE, она будет работать правильно для пустых столбцов, а также для NULL столбцов

SELECT FirstName,
       LastName,
       STUFF(
           COALESCE(',' + NULLIF(StreetAddress, ''), '')  + 
           COALESCE(',' + NULLIF(City, ''), '') +
           COALESCE(',' + NULLIF(Country, ''), '') +
           COALESCE(',' + NULLIF(PostalCode , ''), ''),
           1, 1, '') AS "Address"
   FROM Client
4 голосов
/ 08 марта 2011

Посмотрите на isnull

Вы также можете посмотреть на использование функции COALESCE, посмотрите ее в BOL:

Возвращает первое ненулевое выражение среди своих аргументов.

Наконец, еще одна вещь, которую вы можете сделать, это использовать функцию CASE.

SELECT Address1, CASE Address2 IS NOT NULL THEN "," + Address2 ELSE...
1 голос
/ 08 марта 2011

Вы можете использовать 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 голосов
/ 21 ноября 2018

Это старый вопрос, и в SQL 2012 добавлена ​​функция CONCAT, которая немного упростила подобные вещи. Попробуйте это:

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

CONCAT автоматически обработает NULL как пустую строку, поэтому вам не нужно использовать ISNULL или COALESCE. Функция STUFF предназначена для удаления первой запятой, как в ответе Томаса

0 голосов
/ 09 марта 2011

Другое решение заключается в использовании ISNULL

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

Если значение равно нулю, то результат конкатенации будет нулевым. ISNULL заменит первое выражение вторым выражением.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...