【问题标题】:T-SQL Query ProblemT-SQL 查询问题
【发布时间】:2010-12-11 04:54:32
【问题描述】:

我在数据库中有一个名为 Full Name 的列,我想将该名称拆分为 FirstName 和 LastName:

这是一个例子:

全名 山姆·彼得

我想要这个

FirstName   LastName
-------------------- 
Sam          Peter

但问题是数据库中的某些列具有这样的全名

FullName
--------
Sam George Jack Peter
Sam Adam Peter

我想要这个

FirstName           LastName
---------           --------
Sam George Jack     Peter
Sam Adam            Peter

如何为此编写 T-SQL 查询。

提前感谢所有帮助

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    this answer 中描述了一个非常彻底的名称解析例程。它可以处理您的情况,以及“Mr. Martin J Van Buren III”等更棘手的案例。

    【讨论】:

      【解决方案2】:

      SQL Server 中的字符串操作是出了名的薄弱。

      最好的办法是在应用程序层中进行。

      对于您的示例有两个以上的名称,您如何知道这些附加名称进入哪些字段?你能保证他们永远只有一个姓氏吗?

      【讨论】:

      • 就我而言,我知道它只有一个姓氏
      【解决方案3】:

      在网上找到这个(没有测试过)

      REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1)))
      

      你可以用

      测试一下
      SELECT REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1)))
      FROM Table
      

      如果成功了就可以了

      UPDATE Table
      SET LastName = REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1)))
      

      我把名字的练习留给你。

      【讨论】:

      • 不工作。但是感谢您的帮助
      【解决方案4】:

      你只是在最后一个空格处分裂吗?如果是这样,这应该可行:

      select 'Sam George Jack Peter' as FullName
      into #names
      union select 'Sam Adam Peter'
      
      select LEFT(FullName,LEN(FullName)-CHARINDEX(' ',REVERSE(FullName))) as FirstName
        ,RIGHT(FullName,CHARINDEX(' ',REVERSE(FullName))-1) as LastName
      from #names
      

      编辑: 处理没有空格的名称并将 FullName 作为 LastName

      select 'Sam George Jack Peter' as FullName
      into #names
      union select 'Sam Adam Peter'
      union select 'Peter'
      
      select  CASE 
                  WHEN    CHARINDEX(' ',FullName) = 0 THEN ''
                  ELSE    LEFT(FullName,LEN(FullName)-CHARINDEX(' ',REVERSE(FullName)))
              END as FirstName
              ,CASE 
                  WHEN    CHARINDEX(' ',FullName) = 0 THEN FullName
                  ELSE    LTRIM(RIGHT(FullName,CHARINDEX(' ',REVERSE(FullName))))
              END as LastName
      from #names
      

      【讨论】:

      • 但是我有这么多这样的列所以我需要为每条记录写选择吗?
      • 它给了我以下错误:Msg 536, Level 16, State 2, Line 1 传递给 RIGHT 函数的长度参数无效。
      • @Sam,一旦你掌握了正确的语法,你就可以编写用户定义的函数和databasejournal.com/features/mssql/article.php/3348181/…的用户
      • @Sam,您可能有一些全名没有空格,因此您最终得到的是无效的 RIGHT(FullName,-1)。编辑了处理 this 的响应。
      猜你喜欢
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 2010-12-20
      相关资源
      最近更新 更多