如何在单个语句中组合名字、中间名和姓氏?

How to combine First, Middle, Last names in a single statement?

我需要在 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 是空字符串,我会得到 Saul Rosenberg 和 2 个空格。

如何处理 NULL 和空字符串?

在这些字符串中获得正确的 spaces 实际上是相当棘手的。以下应该完成这项工作。它一次将它们 2 组合起来,如果两者都不为空,则在它们之间添加一个 space。

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)

如果您使用的是最新版本的 SQL 服务器,您可以简单地使用 CONCAT_WS:

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

如果您使用的是旧版本,则可以在每个值之前放置“分隔符”(在本例中为 space (' ')),然后用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;

我认为这符合您的要求:

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