T SQL Conditional String Concatenation

后端 未结 5 815
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-05 16:55

Have a 5 columns of address data. I need to concatenate these fields into a single address with spaces in between the values if they exist. If the column has a null value

相关标签:
5条回答
  • 2021-01-05 17:18

    Something along the lines of:

    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 讨论(0)
  • 2021-01-05 17:22

    Nested isnulls could do what you need. Something like:

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

    relying on the fact that NULL + ' ' = NULL.

    0 讨论(0)
  • 2021-01-05 17:23

    Use the "+" to concatenate strings in 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
    

    The LEN function returns zero if the string value is NULL, or a zero length string.

    0 讨论(0)
  • 2021-01-05 17:23

    First I would declare the seperator as a variable, because customers are notorious for changing these.

    I would do this as follows:

    DECLARE @AddressSeperator NVARCHAR(5) = ' '
    

    ...and then for the column declation, I'd use the following:

    , 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]
    
    0 讨论(0)
  • 2021-01-05 17:30

    I have assumed your data types are all varchar or similar for simplicity. If you are OK with removing any double spaces, how about:

    rtrim(ltrim(replace(isnull(street_number) + ' ' 
        + isnull(street_ext) + ' ' 
        + isnull(street_direct) + ' ' 
        + isnull(site_street) + ' ' 
        + isnull(site_address), '  ', ' ')))
    
    0 讨论(0)
提交回复
热议问题