我在数据库中有一个名为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查询。
先谢谢所有帮助
答案 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