Подтвердить что ты не робот

Как правильно совместить столбцы с использованием T-SQL?

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

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

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

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

Спасибо

4b9b3361

Ответ 1

Когда вы объединяете что-либо с нулевым значением, оно возвращает null. Поэтому я пытаюсь объединить запятую с заданным значением столбца, и если это выражение возвращает значение null, я использую 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

Ответ 2

Если вы включаете функцию 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

Ответ 3

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

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

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

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

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

Ответ 4

Вы можете использовать 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

Ответ 5

Другое решение - использовать ISNULL

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

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

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