Условная конкатенация строк T SQL - PullRequest
4 голосов
/ 11 ноября 2010

Иметь 5 столбцов адресных данных.Мне нужно объединить эти поля в один адрес с пробелами между значениями, если они существуют.Если столбец имеет нулевое значение, я должен пропустить его и не вводить пробелы.

select 
        case 
            when street_number != '' THEN (cast(street_number as int)) 
        end as street_number,
        case
            when street_ext != '' then
                    case
                        when street_ext = 50 then '1/2'
                    end
        end as street_ext,
        case
            when street_direct ! = '' then street_direct
        end as street_direct,
        case
            when site_street ! = '' then site_street
        end as site_street,
        case
            when site_address ! = '' then site_address
        end as site_address
    from parcel 

я хотел бы иметь переменную и присвоить ей значение первого столбца street_number, а затем перейти к следующему столбцу street_ext, если он не равен нулюЯ хотел бы проверить, является ли переменная нулевой, а если нет, добавить пробел и значение ... и так далее в будущем.

Я чертовски ржавый и могу использовать толчокв правильном направлении.

Спасибо всем.

Ответы [ 5 ]

26 голосов
/ 11 ноября 2010

Используйте "+" для объединения строк в TSQL:

SELECT CASE 
         WHEN LEN(p.street_number) > 0 THEN p.street_number + ' ' 
         ELSE '' 
       END +
       CASE 
         WHEN p.street_ext = 50 THEN '1/2'
         WHEN LEN(p.street_ext) > 0 THEN ''
         ELSE p.street_ext
       END + ' ' +
       CASE 
         WHEN LEN(p.street_direct) > 0 THEN p.street_direct + ' '
         ELSE ''
       END + 
       CASE 
         WHEN LEN(p.site_street) > 0 THEN p.site_street + ' '
         ELSE ''
       END  + 
       CASE 
         WHEN LEN(p.site_address) > 0 THEN p.site_address + ' '
         ELSE ''
       END AS full_address
FROM PARCEL p

Функция LEN возвращает ноль, если строковое значение равно NULL, или строку нулевой длины.

5 голосов
/ 11 ноября 2010

Вложенные isnulls могут делать то, что вам нужно. Что-то вроде:

SELECT
     ISNULL(streetnumber + ' ', '')
       + ISNULL(streetext + ' ', '')
       etc

полагаясь на то, что NULL + '' = NULL.

4 голосов
/ 11 ноября 2010

Что-то вроде:

select coalesce(street_number+' ','')+
       coalesce(case when street_ext=50 then '1/2' else null end+' ','')+
       coalesce(street_direct+' ','')+
       coalesce(site_street+' ','')+
       coalesce(site_address,'')
from parcel
3 голосов
/ 11 ноября 2010

Я предположил, что все ваши типы данных varchar или похожи для простоты. Если вы в порядке с удалением любых двойных пробелов, как насчет:

rtrim(ltrim(replace(isnull(street_number) + ' ' 
    + isnull(street_ext) + ' ' 
    + isnull(street_direct) + ' ' 
    + isnull(site_street) + ' ' 
    + isnull(site_address), '  ', ' ')))
0 голосов
/ 22 февраля 2016

Сначала я бы объявил разделитель как переменную, потому что клиенты печально известны его изменением.

Я бы сделал это следующим образом:

DECLARE @AddressSeperator NVARCHAR(5) = ' '

... а затемудаление столбца, я бы использовал следующее:

, CONCAT
(
    (CASE WHEN LEN(p.street_number) > 0 THEN p.street_number + @AddressSeperator ELSE '' END)
    , (CASE WHEN p.street_ext = 50 THEN '1/2' + @AddressSeperator WHEN LEN(p.street_ext) > 0 THEN p.street_ext + @AddressSeperator ELSE '' END)
    , (CASE WHEN LEN(p.street_direct) > 0 THEN p.street_direct + @AddressSeperator ELSE '' END)
    , (CASE WHEN LEN(p.site_street) > 0 THEN p.site_street + @AddressSeperator ELSE '' END)
    , ISNULL(p.site_address, '')

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