T SQL条件字符串连接

时间:2010-11-11 18:14:19

标签: sql tsql

拥有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时,如果它不为null我想检查查看变量是否为null,如果不是,则追加一个空格和值......等等。

我生气了,可以用正确的方向推动。

谢谢大家。

5 个答案:

答案 0 :(得分:26)

使用“+”连接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

如果字符串值为NULL或零长度字符串,则LEN function返回零。

答案 1 :(得分:5)

嵌套的isnulls可以做你需要的。类似的东西:

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

依赖于NULL +''= NULL。

答案 2 :(得分:4)

有些事情:

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 :(得分:3)

为了简单起见,我假设您的数据类型都是varchar或类似的。如果您可以删除任何双重空格,那么:

rtrim(ltrim(replace(isnull(street_number) + ' ' 
    + isnull(street_ext) + ' ' 
    + isnull(street_direct) + ' ' 
    + isnull(site_street) + ' ' 
    + isnull(site_address), '  ', ' ')))

答案 4 :(得分:0)

首先,我会将分隔符声明为变量,因为客户因更改这些变量而臭名昭着。

我会这样做:

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]