【问题标题】:How to concatenate columns properly using T-SQL?如何使用 T-SQL 正确连接列?
【发布时间】:2011-03-08 16:37:21
【问题描述】:

我在表格的多列中有一个地址。

SELECT FirstName, LastName, StreetAddress, City, Country, PostalCode 
FROM Client

我正在尝试使用逗号 (,) 作为分隔符将与地址相关的列连接到一个字段中,但如果“例如城市”列中的任何一个为空或为空,则不应存在逗号。

如何在 TSQL 中像在 c# 中一样使用三元运算符? 或者建议我最好的做法?

谢谢

【问题讨论】:

    标签: sql-server-2005 tsql


    【解决方案1】:

    当您将任何内容与 null 连接时,它会返回 null。所以我试图用给定的列值连接一个逗号,如果该表达式返回 null,我使用 Coalesce 返回一个空字符串。最后,如果我得到一个值,整个结果将以逗号开头。所以我使用 Stuff 函数删除了那个逗号。

    Select Stuff(
        Coalesce(',' + FirstName,'')
        + Coalesce(',' + LastName,'')
        + Coalesce(',' + StreetAddress,'')
        + Coalesce(',' + City,'')
        + Coalesce(',' + Country,'')
        + Coalesce(',' + PostalCode ,'')
        , 1, 1, '')
    From Client
    

    如果您只想要地址,那么显然您只会包含这些列:

    Select FirstName, LastName
        , Stuff(
            Coalesce(',' + StreetAddress,'')
            + Coalesce(',' + City,'')
            + Coalesce(',' + Country,'')
            + Coalesce(',' + PostalCode ,'')
        , 1, 1, '')
    From Client
    

    【讨论】:

    • +1,又学到了一些东西 :) 但是你应该从中删除名字/姓氏,因为我认为 OP 只想连接地址。
    【解决方案2】:

    如果您在 COALESCE 函数中包含 NULLIF 函数,它将适用于空列以及 NULL

    SELECT FirstName,
           LastName,
           STUFF(
               COALESCE(',' + NULLIF(StreetAddress, ''), '')  + 
               COALESCE(',' + NULLIF(City, ''), '') +
               COALESCE(',' + NULLIF(Country, ''), '') +
               COALESCE(',' + NULLIF(PostalCode , ''), ''),
               1, 1, '') AS "Address"
       FROM Client
    

    【讨论】:

    • NULLIF,酷!然后你可以添加一个 LTRIM 和 RTRIM 来删除任何空格以获得 COALESCE(',' + NULLIF(RTRIM(LTRIM(StreetAddress)), ''), '')
    【解决方案3】:

    看看isnull

    你也可以看看使用COALESCE函数,请在BOL里查一下:

    返回第一个非空表达式 在它的论点中。

    最后,您可以做的另一件事是使用 CASE 函数。

    SELECT Address1, CASE Address2 IS NOT NULL THEN "," + Address2 ELSE...
    

    【讨论】:

    • SELECT City1 + ISNULL(City2)? "":","City2 绝对不是有效的 TSQL。
    • @Martin - 抱歉那是 SSIS。但其余的应该是有效的。
    【解决方案4】:

    你可以使用Case-Expression

    create table #Client(
    FirstName varchar(20), 
    LastName varchar(50), 
    StreetAddress varchar(50), 
    City varchar(20), 
    Country varchar(20), 
    PostalCode varchar(20)
    )
    insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Jeff','Bridges','Street1','City1','US','12345')
    insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Steven','Baldwin','Street2','City2','US','12345')
    insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Barack','Obama','Street3',NULL,'US','12345')
    insert into #Client(FirstName,LastName,StreetAddress,City,Country,PostalCode)values('Nora','Jones','Street4','City4','US','12345')
    
    SELECT FirstName, LastName,
    (CASE WHEN City IS NULL AND StreetAddress IS NULL THEN '' 
          WHEN City IS Null AND StreetAddress IS NOT NULL Then StreetAddress 
          WHEN City IS NOT Null AND StreetAddress IS NOT NULL THEN StreetAddress + ',' + City END
    )AS Adress, Country, PostalCode 
    FROM #Client
    
    drop table #Client
    

    【讨论】:

    • @谢谢。但是添加所有找到的列(StreetAddress、City、Country、PostalCode)对我来说真的很难.. ??我将如何使用这个 CASE 语句?
    • @User:使用Thomas solution
    【解决方案5】:

    这是一个老问题,SQL 2012 添加了 CONCAT 函数,使这类事情变得更容易一些。试试这个:

    Select FirstName, LastName, 
        Stuff(
            Concat(
            ',' + FirstName,
            ',' + LastName,
            ',' + StreetAddress,
            ',' + City,
            ',' + Country,
            ',' + PostalCode ),
        1,1,'')
    From Client
    

    CONCAT 会自动将 NULL 视为空字符串,因此您不需要使用 ISNULL 或 COALESCE。 STUFF 函数用于删除第一个逗号,如 Thomas 的回答

    【讨论】:

      【解决方案6】:

      另一种解决方案是使用 ISNULL

      Select FirstName, LastName
          , ISNULL(StreetAddress+', ','')
            +ISNULL(City+', ','')
            +ISNULL(Country+', ','')
            +ISNULL(PostalCode,'')
      FROM Client
      

      如果值为 null,则连接结果将为 null。 ISNULL 将用第二个表达式替换第一个表达式。

      http://msdn.microsoft.com/en-us/library/ms184325(v=SQL.90).aspx

      【讨论】:

        猜你喜欢
        • 2011-08-25
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 2021-10-16
        • 2012-04-12
        • 2017-11-16
        相关资源
        最近更新 更多