【问题标题】:How to combine First, Middle, Last names in a single statement?如何在单个语句中组合名字,中间名,姓氏?
【发布时间】:2021-06-02 12:33:39
【问题描述】:

我需要在 SELECT 语句中将 FirstName、MiddleInitial、LastName 列组合成 DisplayName。问题是 Middle Name 有时为 NULL,有时为空。

数据如下:

FirstName MiddleInitial LastName
Frank P Rizzo
Saul Rosenberg
Ali NULL Kamal

我正在通过以下方式处理 NULL:

SELECT CONCAT(FirstName + ' ', COALESCE(MiddleInitial + ' ', ''), LastName)
FROM dbo.Person

我想从这些行中得到的是Frank P Rizzo, Saul Rosenberg, Ali Kamal
但是,如果 MiddleInitial 是空字符串,我会得到带有 2 个空格的 Saul Rosenberg

如何同时处理 NULL 和空字符串?

【问题讨论】:

    标签: sql sql-server sql-server-2014


    【解决方案1】:

    如果您使用的是最新版本的 SQL Server,则只需使用CONCAT_WS

    SELECT CONCAT_WS(' ',Firstname, MiddleInitial, LastName
    FROM dbo.YourTable;
    

    如果您使用的是旧版本,您可以将“分隔符”(在本例中为空格 (' '))放在每个值之前,然后用 STUFF 去掉第一个值:

    SELECT STUFF(CONCAT(' ' + Firstname, ' ' + MiddleInitial, ' ' + LastName),1,1,'')
    FROM dbo.YourTable;
    

    如果一个值可能是空白的,那么你真的应该修复你的设计并且有一个不允许'' 值的检查约束,但是你可以用NULLIF 包装每个值:

    SELECT STUFF(CONCAT(' ' + NULLIF(Firstname,''), ' ' + NULLIF(MiddleInitial,''), ' ' + NULLIF(LastName,'')),1,1,'')
    FROM dbo.YourTable;
    

    【讨论】:

    • 请注意,对于concat_ws() 解决方案,空字符串也需要替换为NULLs,这也可以使用nullif() 来完成,如图所示。
    【解决方案2】:

    在这类字符串中获取正确的空格实际上是相当棘手的。以下应该做的工作。它一次将它们组合 2 个,如果两者都不为空白,则在它们之间添加一个空格。

    SELECT  COALESCE(N.Forename, '') + CASE WHEN COALESCE(N.Forename, '') != ''
                                                 AND COALESCE(P.Surname, '') != '' THEN ' '
                                            ELSE ''
                                       END + COALESCE(P.Surname, '')
    FROM    dbo.Person
    CROSS APPLY ( VALUES ( COALESCE(P.FirstName, '') + CASE WHEN COALESCE(P.FirstName, '') != ''
                                                                 AND COALESCE(P.MiddleInitial, '') != '' THEN ' '
                                                            ELSE ''
                                                       END + COALESCE(P.MiddleInitial, '')) ) AS N (Forename)
    

    【讨论】:

      【解决方案3】:

      我认为这是你想要的:

      select ltrim( (case when firstname <> '' then ' ' + firstname else '' end) +
                    (case when MiddleInitial <> '' then ' ' + MiddleInitial else '' end) +
                    (case when lastname <> '' then ' ' + lastname else '' end)
                  ) 
      
                
                
      

      【讨论】:

        猜你喜欢
        • 2021-11-03
        • 2020-05-06
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多