2010-11-11 69 views
4

有5列地址数据。我需要将这些字段连接成一个地址,如果它们存在,则这些字段之间有空格。如果该列有空值,我应该跳过它并且不输入任何空格。T SQL条件字符串连接

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

我很生疏,可以用正确的方向推动。

谢谢大家。

+0

感谢大家的快速作出回应,你们岩。 – jim 2010-11-11 18:41:09

回答

23

用“+”来连接字符串中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 function返回零如果字符串值为NULL,或一个零长度的字符串。

+0

谢谢...这只有一些修改完美工作。 – jim 2010-11-11 18:42:56

3

为了简单起见,我假定您的数据类型都是varchar或类似的。如果你是清除任何双空格OK,怎么样:

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

嵌套isnulls可以做你所需要的。例如:

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

依靠NULL +''= NULL的事实。

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 
+0

这不起作用。 COALESCE(street_number +'','')将始终返回street_number +''选项,因为由于空格连接到结尾,它将永远不会为空。 – AlphaKilo 2014-04-25 14:02:32

0

首先我想声明的分隔符为变量,因为客户是臭名昭著的改变这些。

我会做如下:

DECLARE @AddressSeperator NVARCHAR(5) = ' ' 

...,然后列declation,我会使用以下命令:

, 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]