在T-SQL中组合First,Middle Initial,Last name和Suffix(无额外空格)

问题描述 投票:10回答:9

我试图不在这里重新发明轮子......我有这四个领域:

[tbl_Contacts].[FirstName],
[tbl_Contacts].[MiddleInitial],
[tbl_Contacts].[LastName],
[tbl_Contacts].[Suffix] 

我想在视图中创建一个FullName字段,但如果字段为空,我就不能有额外的空格...

所以我不能做FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix...因为如果没有中间的首字母或后缀我会在字段中有2个额外的空格。我想我需要一个Case语句,但我认为有人会有一个方便的方法...此外,middleinitialsuffix可能为null。

sql sql-server tsql
9个回答
25
投票

假设所有列都可以为空,您可以执行以下操作:

RTrim(Coalesce(FirstName + ' ','') 
+ Coalesce(MiddleInitial + ' ', '')
+ Coalesce(LastName + ' ', '')
+ Coalesce(Suffix, ''))

这取决于添加到NULL值会产生NULL的事实。


12
投票

无论您选择哪种选项,都需要考虑以下事项:这将是一个相当复杂且因此耗时的选项,特别是如果您在视图中对每个有问题的每一行进行评估。

如果你经常需要这个,我建议你把它作为一个持久的计算字段添加到你的基表 - 如下所示:

ALTER TABLE dbo.tbl_Contacts
    ADD FullName AS  (insert the statement of your choice here) PERSISTED

当它持久化时,它将成为基础表的一部分,并由SQL Server存储并保持最新。当您查询它时,您将获得当前值,而不会产生必须将字段连接在一起并确定要使用哪些以及忽略哪些内容的成本...

只是需要考虑的事情 - 太多的DBA和数据库开发者倾向于忽视和/或不了解....


9
投票

您可能希望通过FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix函数传递REPLACE()连接,以便将重复的空格替换为单个空格。

REPLACE(FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix, '  ', ' ')
--                                                                        --    -

编辑:

刚刚注意到你的一些字段可能是NULL,因此在这种情况下上述不起作用,因为整个字符串将成为NULL。在这种情况下,您可以使用COALESCE() method as suggested by Thomas,但仍然将其包装在REPLACE()中:

REPLACE(RTRIM(COALESCE(FirstName + ' ', '') +
              COALESCE(MiddleInitial + ' ', '') +
              COALESCE(LastName + ' ', '') +
              COALESCE(Suffix, '')), '  ', ' ')

测试:

SELECT REPLACE(RTRIM(COALESCE('John' + ' ', '') +
                     COALESCE('' + ' ', '') +
                     COALESCE('Doe' + ' ', '') +
                     COALESCE(NULL, '')), '  ', ' ')

-- Returns: John Doe

1
投票

我必须加入名字,中间名和姓氏。我的挑战是处理NULL值,使用下面的代码。

RTRIM(LTRIM(RTRIM(isnull(@firstname,'') + ' ' + isnull(@middlename,'')) + ' ' + isnull(@lastname,'')))

如果您有兴趣测试不同的场景:)

DECLARE @firstname VARCHAR(MAX)
DECLARE @middlename VARCHAR(MAX)
DECLARE @lastname VARCHAR(MAX)

set @firstname = 'FirstName'
set @middlename = NULL
set @lastname = 'LastName'

SELECT '|'+RTRIM(LTRIM(RTRIM(isnull(@firstname,'') + ' ' + isnull(@middlename,'')) + ' ' + isnull(@lastname,'')))+'|'
--

1
投票

如果你使用SQL Server 2012+你可以使用CONCAT+

SELECT RTRIM(
       CONCAT(FirstName + ' ', MiddleInitial + ' ', LastName + ' ', Suffix)
      ) AS [FullName]
FROM tbl_Contacts;

这个怎么运作:

  1. 如果全名的任何部分是NULL然后NULL + ' 'NULL
  2. CONCAT处理NULL
  3. 如果在名称的一部分之后只有NULLsTRIM最后的空间。

LiveDemo


0
投票

这是一个解决方案:

CREATE FUNCTION dbo.udf_IsNullOrEmpty
(
@vchCheckValue VARCHAR(MAX)
,@vchTrueValue VARCHAR(MAX)
,@vchFalseValue VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN

RETURN CASE WHEN NULLIF(RTRIM(LTRIM(@vchCheckValue)),'') IS NULL THEN @vchTrueValue ELSE @vchFalseValue END

END

SELECT FirstName + ' ' + 
       dbo.udf_IsNullOrEmpty(MiddleInitial,'',MiddleInitial + ' ') + 
       LastName + 
       dbo.udf_IsNullOrEmpty(Suffix,'',' ' + Suffix)
FROM tbl_Contacts

0
投票

从表中选择CONCAT(IFNULL(FirstName,''),'',IFNULL(MiddleName,''),'',IFNULL(LastName,''))AS名称


-1
投票

create function getfname(@n varchar(30))返回varchar(30)作为begin声明@s varchar(30)set @ s = LEFT(@ n,charindex('',@ n)-1)return @s end

create function getLname(@n varchar(30))返回varchar(30)作为begin declare @s varchar(30)

设置@ s = substring(@ n,charindex('',@ n + 1),Len(@n))

返回@s结束


-2
投票

查询:

SELECT retire.employeehrmsid, 
       Isnull(retire.firstname, '') + ' ' 
       + Isnull(retire.middlename, '') + ' ' 
       + Isnull(retire.lastname, '') AS FullName, 
       retire.dojtoservice, 
       retire.designation, 
       emphistory.currentdoj, 
       emphistory.presentddo, 
       emphistory.office, 
       transfer.generatetid          AS TransferID, 
       transfer.transferdate, 
       transfer.currentlocation, 
       transfer.newlocation, 
       transfer.datas                AS Transfer_Doc, 
       release.generaterid           AS ReleaseID, 
       release.releasedate, 
       release.datar                 AS Release_Doc, 
       employeeserviceupdate.dataeu  AS Join_Doc 
FROM   retire 
       INNER JOIN emphistory 
               ON retire.id = emphistory.id 
       INNER JOIN employeeserviceupdate 
               ON retire.id = employeeserviceupdate.id 
       INNER JOIN transfer 
               ON retire.id = transfer.id 
                  AND emphistory.ehrid = transfer.ehrid 
       INNER JOIN release 
               ON transfer.tid = release.tid 
© www.soinside.com 2019 - 2024. All rights reserved.