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

Pau*_*aul 10 sql t-sql sql-server

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

[tbl_Contacts].[FirstName],
[tbl_Contacts].[MiddleInitial],
[tbl_Contacts].[LastName],
[tbl_Contacts].[Suffix] 
Run Code Online (Sandbox Code Playgroud)

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

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

Tho*_*mas 26

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

RTrim(Coalesce(FirstName + ' ','') 
+ Coalesce(MiddleInitial + ' ', '')
+ Coalesce(LastName + ' ', '')
+ Coalesce(Suffix, ''))
Run Code Online (Sandbox Code Playgroud)

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


mar*_*c_s 13

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

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

ALTER TABLE dbo.tbl_Contacts
    ADD FullName AS  (insert the statement of your choice here) PERSISTED
Run Code Online (Sandbox Code Playgroud)

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

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


Dan*_*llo 9

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

REPLACE(FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix, '  ', ' ')
--                                                                        --    -
Run Code Online (Sandbox Code Playgroud)

编辑:

只是注意到你的某些字段可能是NULL,因此在这种情况下,上面的内容将不起作用,因为整个字符串将成为NULL.在这种情况下,您可以使用COALESCE() Thomas建议方法,但仍将其包装在REPLACE():

REPLACE(RTRIM(COALESCE(FirstName + ' ', '') +
              COALESCE(MiddleInitial + ' ', '') +
              COALESCE(LastName + ' ', '') +
              COALESCE(Suffix, '')), '  ', ' ')
Run Code Online (Sandbox Code Playgroud)

测试:

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

-- Returns: John Doe
Run Code Online (Sandbox Code Playgroud)