Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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_Sql Server 2012 - Fatal编程技术网

Sql 将姓氏、名和后缀提取到单独的列中

Sql 将姓氏、名和后缀提取到单独的列中,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我想知道是否有人能为我提供一种简单的方法,将名称提取到不同的列中,如下所示。姓氏后有逗号,名字、中间首字母和后缀之间有空格。非常感谢 存储的数据: Name Walker,James M JR Smith,Jack P Smith,Whitney LastName FirstName Suffix Walker James JR Smith Jack Smith Whitney select top 5 Name, LEFT(Name, CHA

我想知道是否有人能为我提供一种简单的方法,将名称提取到不同的列中,如下所示。姓氏后有逗号,名字、中间首字母和后缀之间有空格。非常感谢

存储的数据:

Name
Walker,James M JR
Smith,Jack P
Smith,Whitney
LastName   FirstName   Suffix
Walker     James       JR
Smith      Jack
Smith      Whitney
select top 5 Name,
LEFT(Name, CHARINDEX(',', Name) - 1) AS LastName,
right(Name, len(Name) - CHARINDEX(',', Name)) as FirstName
所需结果:

Name
Walker,James M JR
Smith,Jack P
Smith,Whitney
LastName   FirstName   Suffix
Walker     James       JR
Smith      Jack
Smith      Whitney
select top 5 Name,
LEFT(Name, CHARINDEX(',', Name) - 1) AS LastName,
right(Name, len(Name) - CHARINDEX(',', Name)) as FirstName
已尝试代码:

Name
Walker,James M JR
Smith,Jack P
Smith,Whitney
LastName   FirstName   Suffix
Walker     James       JR
Smith      Jack
Smith      Whitney
select top 5 Name,
LEFT(Name, CHARINDEX(',', Name) - 1) AS LastName,
right(Name, len(Name) - CHARINDEX(',', Name)) as FirstName

只是把名字和中间的首字母和后缀分开有问题。然后从右边最后一个空格中获取后缀。

您确实应该将名称的这些部分存储在单独的列中(第一个标准形式),以避免此类解析

您可以将所有逻辑放在一个嵌套函数的大型调用中,但是使用
交叉应用
将它们分离为单个调用非常方便

解析过程非常简单:

  • 查找逗号的位置
  • 将字符串拆分为逗号前的部分(
    LastName
    )和逗号后的部分
  • 在逗号后的第二部分中查找第一个空格的位置
  • 再次将字符串拆分为两部分-这将给出
    FirstName
    和其余部分(
    AfterSpace
  • AfterSpace
  • 再次将字符串拆分为两部分-这将给出
    首字母
    后缀
查询还检查
CHARINDEX
的结果-如果找不到字符串,则返回0

显然,如果字符串值不是预期的格式,您将得到不正确的结果

DECLARE @T TABLE (Name varchar(8000));
INSERT INTO @T (Name) VALUES
('Walker'),
('Walker,James M JR'),
('Smith,Jack P'),
('Smith,Whitney');

SELECT
    Name
    ,LastName
    ,AfterComma
    ,FirstName
    ,AfterSpace
    ,MidInitial
    ,Suffix
FROM
    @T
    CROSS APPLY (SELECT CHARINDEX(',', Name) AS CommaPosition) AS CA_CP
    CROSS APPLY (SELECT CASE WHEN CommaPosition > 0 THEN 
        LEFT(Name, CommaPosition - 1) ELSE Name END AS LastName) AS CA_LN
    CROSS APPLY (SELECT CASE WHEN CommaPosition > 0 THEN 
        SUBSTRING(Name, CommaPosition + 1, 8000) ELSE '' END AS AfterComma) AS CA_AC

    CROSS APPLY (SELECT CHARINDEX(' ', AfterComma) AS SpacePosition) AS CA_SP
    CROSS APPLY (SELECT CASE WHEN SpacePosition > 0 THEN 
        LEFT(AfterComma, SpacePosition - 1) ELSE AfterComma END AS FirstName) AS CA_FN
    CROSS APPLY (SELECT CASE WHEN SpacePosition > 0 THEN 
        SUBSTRING(AfterComma, SpacePosition + 1, 8000) ELSE '' END AS AfterSpace) AS CA_AS

    CROSS APPLY (SELECT CHARINDEX(' ', AfterSpace) AS Space2Position) AS CA_S2P
    CROSS APPLY (SELECT CASE WHEN Space2Position > 0 THEN 
        LEFT(AfterSpace, Space2Position - 1) ELSE AfterSpace END AS MidInitial) AS CA_MI
    CROSS APPLY (SELECT CASE WHEN Space2Position > 0 THEN 
        SUBSTRING(AfterSpace, Space2Position + 1, 8000) ELSE '' END AS Suffix) AS CA_S
结果

Name                 LastName    AfterComma    FirstName    AfterSpace  MidInitial  Suffix
Walker               Walker
Walker,James M JR    Walker      James M JR    James        M JR        M           JR
Smith,Jack P         Smith       Jack P        Jack         P           P
Smith,Whitney        Smith       Whitney       Whitney

看看可用的字符串函数。您需要的应该是
子字符串
charindex
的组合。选择前5名,左(Name,charindex(',',',Name)-1)作为lastname,右(Name,len(Name)-charindex(',',',,Name))作为firstname…..我现在正在分离firstname和后缀。从您的示例数据中,你怎么知道
P
是中间的首字母而不是后缀?(不考虑领域知识,因为计算机没有)似乎我们的用户输入lastname,然后输入逗号,然后输入firstname,然后输入空格MI,然后输入空格后缀。所以可能是firstname到达MI后的第一个空格,第二个空格将到达suffix。或者,让我们只获取Lastname和firstname,让它更简单。我认为后缀可能是一种选择。那么,在我更新的代码中,如何删除firstname之后的所有内容呢?噢,哇!我同意正常化。我想知道为什么我们的供应商以这种方式组合名称。真痛苦。