【问题标题】:How to parse out the first name, lastname and middle name out of this fullname如何从这个全名中解析出名字、姓氏和中间名
【发布时间】:2020-02-21 06:08:12
【问题描述】:

如何从这个全名中解析出名字、姓氏和中间名

例子

 Fullname 
 ------------------
 Jose,KENNETH;N

【问题讨论】:

标签: tsql select sql-server-2012


【解决方案1】:

如果你的名字总是包含三个部分,并且没有一个超过 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

【讨论】:

    【解决方案2】:

    希望对你有帮助!!!

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 请注意,我在假设 Jose 是名字的情况下进行操作。如果没有,那么修复应该很容易。 ;)
      • 感谢艾伦!何塞是姓氏。无论如何都可以在不使用交叉应用的情况下解析它。而是像这样 SUBSTRING(replace(name,';',''), 1, CHARINDEX(',', replace(name,';','')) - 1)
      • 你可以在没有交叉应用的情况下做到这一点,但这会产生更长、更麻烦的代码。
      • @jason312 我更新了我的答案。正如 Zohar 所逃避的那样,APPLY 允许更简洁的代码。请注意,如何使用 APPLY 创建此表达式:CHARINDEX(',',@string) 然后将表达式引用 4X 次为 a.pos。这没有性能损失。
      猜你喜欢
      • 1970-01-01
      • 2022-12-09
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多