代码之家  ›  专栏  ›  技术社区  ›  jim

条件字符串连接

  •  4
  • jim  · 技术社区  · 15 年前

    有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 回复  |  直到 15 年前
        1
  •  28
  •   OMG Ponies    15 年前

    使用“+”连接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 如果字符串值为空,则返回零;如果字符串长度为零,则返回零。

        2
  •  5
  •   Mike Burton    15 年前

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

    依赖于NULL+''=NULL这一事实。

        3
  •  4
  •   chezy525    15 年前

    大致如下:

    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
    
        4
  •  3
  •   D'Arcy Rittich    15 年前

    rtrim(ltrim(replace(isnull(street_number) + ' ' 
        + isnull(street_ext) + ' ' 
        + isnull(street_direct) + ' ' 
        + isnull(site_street) + ' ' 
        + isnull(site_address), '  ', ' ')))
    
        5
  •  0
  •   WonderWorker Sakal    10 年前

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

    DECLARE @AddressSeperator NVARCHAR(5) = ' '
    

    …然后对于列decalation,我将使用以下命令:

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