在T-SQL中组合First,Middle Initial,Last name和Suffix(无额外空格)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在T-SQL中组合First,Middle Initial,Last name和Suffix(无额外空格)相关的知识,希望对你有一定的参考价值。
我试图不在这里重新发明轮子......我有这四个领域:
[tbl_Contacts].[FirstName],
[tbl_Contacts].[MiddleInitial],
[tbl_Contacts].[LastName],
[tbl_Contacts].[Suffix]
我想在视图中创建一个FullName
字段,但如果字段为空,我就不能有额外的空格...
所以我不能做FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix...
因为如果没有中间的首字母或后缀我会在字段中有2个额外的空格。我想我需要一个Case语句,但我认为有人会有一个方便的方法...此外,middleinitial
和suffix
可能为null。
假设所有列都可以为空,您可以执行以下操作:
RTrim(Coalesce(FirstName + ' ','')
+ Coalesce(MiddleInitial + ' ', '')
+ Coalesce(LastName + ' ', '')
+ Coalesce(Suffix, ''))
这取决于添加到NULL值会产生NULL的事实。
无论您选择哪种选项,都需要考虑以下事项:这将是一个相当复杂且因此耗时的选项,特别是如果您在视图中对每个有问题的每一行进行评估。
如果你经常需要这个,我建议你把它作为一个持久的计算字段添加到你的基表 - 如下所示:
ALTER TABLE dbo.tbl_Contacts
ADD FullName AS (insert the statement of your choice here) PERSISTED
当它持久化时,它将成为基础表的一部分,并由SQL Server存储并保持最新。当您查询它时,您将获得当前值,而不会产生必须将字段连接在一起并确定要使用哪些以及忽略哪些内容的成本...
只是需要考虑的事情 - 太多的DBA和数据库开发者倾向于忽视和/或不了解....
您可能希望通过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
我必须加入名字,中间名和姓氏。我的挑战是处理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,'')))+'|'
--
如果你使用SQL Server 2012+
你可以使用CONCAT
和+
:
SELECT RTRIM(
CONCAT(FirstName + ' ', MiddleInitial + ' ', LastName + ' ', Suffix)
) AS [FullName]
FROM tbl_Contacts;
这个怎么运作:
- 如果全名的任何部分是
NULL
然后NULL + ' '
→NULL
CONCAT
处理NULL
- 如果在名称的一部分之后只有
NULLs
,TRIM
最后的空间。
这是一个解决方案:
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
从表中选择CONCAT(IFNULL(FirstName,''),'',IFNULL(MiddleName,''),'',IFNULL(LastName,''))AS名称
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结束
查询:
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
以上是关于在T-SQL中组合First,Middle Initial,Last name和Suffix(无额外空格)的主要内容,如果未能解决你的问题,请参考以下文章
从 Last,First,Middle,Suffix 形式解析名称组件