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

时间:2010-04-23 15:30:30

标签: sql sql-server tsql

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

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

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

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

10 个答案:

答案 0 :(得分:25)

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

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

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

答案 1 :(得分:12)

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

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

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

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

需要考虑的事情 - 太多DBA和数据库开发人员倾向于忽视和/或不知道......

答案 2 :(得分:9)

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

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

答案 3 :(得分: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,'')))+'|'
--

答案 4 :(得分: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最后一个空格。
  4. LiveDemo

答案 5 :(得分: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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

为什么不喜欢这个:

A problem occurred evaluating root project 'xxxxx'.
> Could not find method compile() for arguments [file collection] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

我的列不为空,所以这对我有用。

答案 8 :(得分:-1)

创建函数getfname(@n varchar(30)) 返回varchar(30) 如 开始 声明@s varchar(30) 设置@ s = LEFT(@ n,charindex('',@ n)-1) 回来@s 端

创建函数getLname(@n varchar(30)) 返回varchar(30) 如 开始 声明@s varchar(30)

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

返回@s 端

答案 9 :(得分:-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