代码之家  ›  专栏  ›  技术社区  ›  Paul

在T-SQL中组合名字、中间名、姓氏和后缀(无多余空格)

  •  10
  • Paul  · 技术社区  · 14 年前

    我不想在这里重新发明轮子……我有四个领域:

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

    我想创建一个 FullName 视图中的字段,但如果字段为空,则不能有多余的空格…

    所以我做不到 FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix... 因为如果没有中间的首字母或后缀,字段中会有两个额外的空格。我想我需要一个案例陈述,但我想有人会有一个简便的方法来解决这个问题…还有,M iddleinitial suffix 可能为空。

    9 回复  |  直到 6 年前
        1
  •  25
  •   Thomas    14 年前

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

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

    这依赖于这样一个事实:添加到一个空值会产生一个空值。

        2
  •  12
  •   marc_s    14 年前

    无论您选择哪种选项,这里都有一些要考虑的问题:这将是一个相当复杂的、耗时的选项,特别是如果您在一个视图中对每一行都进行了每次评估。

    如果您经常需要这样做,我建议您将它作为持久化计算字段添加到基表中-类似于:

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

    当它被持久化时,它将成为基础表的一部分,并由SQL Server存储和保持最新。当你查询它时,你会得到当前值 没有 导致必须将字段连接在一起并确定使用哪个字段和忽略哪个字段的成本…

    只是一些需要考虑的事情-太多DBA和数据库开发人员往往忽略和/或不知道的事情…

        3
  •  9
  •   Community CDub    7 年前

    你可能想通过 FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix 通过连接 REPLACE() 函数的作用是将重复的空格替换为单个空格。

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

    编辑:

    刚刚注意到你的一些领域可能 NULL 因此,在这种情况下,上面的内容将不起作用,因为整个字符串将变为 无效的 . 在这种情况下,您可以使用 COALESCE() method as suggested by Thomas 但仍然用 替换() :

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

    测试:

    SELECT REPLACE(RTRIM(COALESCE('John' + ' ', '') +
                         COALESCE('' + ' ', '') +
                         COALESCE('Doe' + ' ', '') +
                         COALESCE(NULL, '')), '  ', ' ')
    
    -- Returns: John Doe
    
        4
  •  1
  •   Vijred    9 年前

    我必须加入firstname、middlename和lastname。我的挑战是处理空值,使用以下代码。

    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,'')))+'|'
    --
    
        5
  •  1
  •   Lukasz Szozda    8 年前

    如果您正在使用 SQL Server 2012+ 你可以使用 CONCAT + :

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

    它是如何工作的:

    1. 如果全名的任何部分是 NULL 然后 NULL + ' ' 艾斯 无效的
    2. 康塔特 把手 无效的
    3. 如果名字后面只有 NULLs , TRIM 最后一个空间。

    LiveDemo

        6
  •  0
  •   Jonathan    14 年前

    以下是一个解决方案:

    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
    
        7
  •  0
  •   Harikumar    8 年前

    选择concat(ifnull(名字“”), ’ ifnull(中间名“”), ’ ifnull(姓氏“”)作为名称 从表

        8
  •  -1
  •   Akshay Kumar Konduri    10 年前

    创建函数getfname(@n varchar(30)) 返回varchar(30) 作为 开始 声明@s varchar(30) 设置@s=左(@n,charindex('',@n)-1) 返回@ 结束

    创建函数getlname(@n varchar(30)) 返回varchar(30) 作为 开始 声明@s varchar(30)

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

    返回@ 结束

        9
  •  -2
  •   Akber Iqbal    6 年前

    查询:

    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