如何在单个语句中组合名字、中间名和姓氏?
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)
)
我需要在 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)
)