Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在字段中拆分姓氏和后缀_Sql_Sql Server - Fatal编程技术网

Sql 在字段中拆分姓氏和后缀

Sql 在字段中拆分姓氏和后缀,sql,sql-server,Sql,Sql Server,我有一个包含后缀的姓氏字段,我需要将该字段拆分为姓氏字段和后缀字段。我尝试过charindex,但语法方面遇到了困难。数据样本如下: Miller Wilson Jr Hearne Sr Horner III Bond jr Jones-Alexander Brown ii Rodriguez Maldonado Appleby 我试图在SQLServer中找到一个可靠的select语句,将这些数据拉入另一个表中,并将姓氏和后缀分开 谢谢你的帮助 编辑作为答案发布的附加信息 如果没有后缀,我

我有一个包含后缀的姓氏字段,我需要将该字段拆分为姓氏字段和后缀字段。我尝试过charindex,但语法方面遇到了困难。数据样本如下:

Miller 
Wilson Jr
Hearne Sr
Horner III
Bond jr
Jones-Alexander
Brown ii
Rodriguez Maldonado
Appleby
我试图在SQLServer中找到一个可靠的select语句,将这些数据拉入另一个表中,并将姓氏和后缀分开

谢谢你的帮助

编辑作为答案发布的附加信息

如果没有后缀,我想 将姓氏输入姓氏字段, 并将后缀保留为Null

幸运的是,没有名字 或者这个领域的头衔,所以我不会 不得不担心那些,只是 二、 三,四,小,老,最后两部分 姓名


您应该能够使用CASE语句来检查您在数据中看到的名称是否足够

CASE WHEN POSITION(' Jr' IN LastName) > 0 
     THEN SUBSTRING(LastName FROM POSITION(' Jr' IN LastName) FOR 2)
     WHEN POSITION(' III' IN LastName) > 0
     ....
END

它当然不会捕获所有内容,您可能需要不断调整它。您的另一个选择是引入一个数据质量工具,该工具可以使用已知的名称和姓氏列表以及后缀和标题来解析名称数据。别忘了你可能会遇到医学博士约翰·M·史密斯三世。你打算怎么处理呢?

谢谢你的帮助。最后我用一个案例陈述来得到我所需要的。它看起来有点粗糙,但看起来对于我所需要的东西来说是可靠的:

CASE
  WHEN (mytable.L_NAME like '% Jr') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1)
  WHEN (mytable.L_NAME like '% Sr') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1)
  WHEN (mytable.L_NAME like '% II') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1)
  WHEN (mytable.L_NAME like '% III') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1)
  WHEN (mytable.L_NAME like '% IV') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1)
  WHEN (mytable.L_NAME like '% V') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1)
  WHEN (mytable.L_NAME like '% VI') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1)
  ELSE mytable.L_NAME
END
AS LastName,

CASE
  WHEN (mytable.L_NAME like '% Jr') Then 'Jr'
  WHEN (mytable.L_NAME like '% Sr') Then 'Sr'
  WHEN (mytable.L_NAME like '% II') Then 'II'
  WHEN (mytable.L_NAME like '% III') Then 'III'
  WHEN (mytable.L_NAME like '% IV') Then 'IV'
  WHEN (mytable.L_NAME like '% V') Then 'V'
  WHEN (mytable.L_NAME like '% VI') Then 'VI'
  ELSE NULL
END
AS Suffix,

如果没有后缀该怎么办?类似帖子:名字在本质上是极其复杂的,因为一个人的名字有1000种存在方式。这里有一个博客,如果在后缀前的姓氏中有空格,这些将不起作用。示例:“Smith-Jones V”匹配“%V”,因此您的代码搜索第一个空格并返回“Smith”-“Jones”将永远丢失。如果你搜索“V”而不是一个空格,你就更接近了。。。但是对于数据“Smith Vincent V”,您仍然会丢失“Vincent”。相反,请使用
子字符串(mytable.L_Name,1,Len(mytable.L_Name)-2)
-而不是2,使用比后缀长度长的1(2表示V,3表示II和IV,JR,4表示III,依此类推)。