T-SQL查询问题

时间:2010-12-10 19:36:03

标签: sql sql-server tsql

我在数据库中有一个名为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查询。

先谢谢所有帮助

4 个答案:

答案 0 :(得分:2)

this answer中描述了一个非常彻底的名称解析例程。它处理你的情况,以及诸如“Martin J Van Buren III先生”等棘手的案件。

答案 1 :(得分:0)

SQL Server中的字符串操作非常弱。

最好的办法是在申请层中进行。

对于包含2个以上名称的示例,您如何知道这些附加名称所涉及的字段?你能保证他们总是只有一个姓吗?

答案 2 :(得分:0)

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

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)))

我把这个名字的练习留给你。

答案 3 :(得分:0)

你只是在最后一个空间分裂吗?如果是这样,这应该有效:

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