【发布时间】:2020-02-21 06:08:12
【问题描述】:
如何从这个全名中解析出名字、姓氏和中间名
例子
Fullname
------------------
Jose,KENNETH;N
【问题讨论】:
标签: tsql select sql-server-2012
如何从这个全名中解析出名字、姓氏和中间名
例子
Fullname
------------------
Jose,KENNETH;N
【问题讨论】:
标签: tsql select sql-server-2012
如果你的名字总是包含三个部分,并且没有一个超过 128 个字符,并且没有一个包含点,你可以(ab)使用parsename:
DECLARE @string VARCHAR(1000) = 'Jose,KENNETH;N'
SELECT PARSENAME(fullName, 1) As MiddleName,
PARSENAME(fullName, 2) As FirstName,
PARSENAME(fullName, 3) As LastName
FROM (VALUES(REPLACE(REPLACE(@string, ';', '.'), ',', '.'))) V(fullName)
结果:
MiddleName FirstName LastName
N KENNETH Jose
【讨论】:
希望对你有帮助!!!
DECLARE @string VARCHAR(1000) = 'Jose,KENNETH;N'
select @string AS FullName, substring(@string,1,CHARINDEX(',',@string)-1) as LastName,
SUBSTRING(@string,charindex(',',@string)+1,len(@string)-Charindex(',',@string)-charindex(';',REVERSE(@string))) as FirstName,
SUBSTRING(@string,Charindex(';',@string)+1,len(@string)) as MiddleName
【讨论】:
APPLY 是你的朋友。
查询:
DECLARE @string VARCHAR(1000) = 'Jose,KENNETH;N'
SELECT
FullName = @string,
FirstName = SUBSTRING(@string,0,a.pos),
LastName = SUBSTRING(@string,a.pos+1,b.pos-a.pos-1),
Middle = SUBSTRING(@string,b.pos+1,8000)
FROM (VALUES(CHARINDEX(',',@string))) AS a(pos)
CROSS APPLY (VALUES(CHARINDEX(';',@string,a.pos))) AS b(pos);
结果:
FullName FirstName LastName Middle
------------------ ---------- --------- --------
Jose,KENNETH;N Jose KENNETH N
根据 OP 的评论更新
不使用APPLY:
SELECT
FullName = @string,
FirstName = SUBSTRING(@string,0,CHARINDEX(',',@string)),
LastName = SUBSTRING(@string,CHARINDEX(',',@string)+1,CHARINDEX(';',@string,CHARINDEX(',',@string))-CHARINDEX(',',@string)-1),
Middle = SUBSTRING(@string,CHARINDEX(';',@string,CHARINDEX(',',@string))+1,8000);
【讨论】:
CHARINDEX(',',@string) 然后将表达式引用 4X 次为 a.pos。这没有性能损失。