Tsql 如何从这个全名中解析出名字、姓氏和中间名
如何从这个全名中解析出名字、姓氏和中间名 范例Tsql 如何从这个全名中解析出名字、姓氏和中间名,tsql,select,sql-server-2012,Tsql,Select,Sql Server 2012,如何从这个全名中解析出名字、姓氏和中间名 范例 Fullname ------------------ Jose,KENNETH;N APPLY是你的朋友 查询: DECLARE @string VARCHAR(1000) = 'Jose,KENNETH;N' SELECT FullName = @string, FirstName = SUBSTRING(@string,0,a.pos), LastName = SUBSTRING(@string,a.pos+1,
Fullname
------------------
Jose,KENNETH;N
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
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);
结果:
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
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);
根据OP的评论进行更新
不使用应用
:
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
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);
希望这对你有帮助
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
如果您的名称始终包含三个部分,并且没有一个超过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
请注意,我是在假设Jose是第一个名字的情况下操作的。如果没有,那么修复应该很容易谢谢艾伦!何塞是他的姓。是否仍然可以在不使用交叉应用的情况下解析此内容。相反,类似这样的子字符串(replace(name,“;”,”),1,CHARINDEX(“,”,replace(name,“;”,”))-1)您可以在不交叉应用的情况下执行此操作,但这会生成更长、更麻烦的代码。@jason312我更新了答案。正如Zohar逃避的那样,APPLY允许更干净的代码。请注意如何使用APPLY创建此表达式:
CHARINDEX(',',@string)
然后将表达式引用4次,作为a.pos
。这将导致性能下降。建议阅读:。