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之后的所有内容呢?噢,哇!我同意正常化。我想知道为什么我们的供应商以这种方式组合名称。真痛苦。