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
。这将导致性能下降。建议阅读:。