sql-server - 在 SQL Server 中拆分前缀、名字、中间名和姓氏中的全名
问题描述
我正在尝试使用 SQL Server和 、 和Prefix
拆分First Name
全名。Middle Name
Last Name
我尝试了以下方法,但由于所需的输出不正确,因此无法正常工作。
代码
SELECT TOP 10
ID,
FullName,
SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName)) AS Full_Name,
SUBSTRING(FullName, 1, CHARINDEX(' ', FullName)) AS Prefix,
SUBSTRING(FullName, CHARINDEX(' ', FullName), LEN(FullName) - CHARINDEX(' ', REVERSE(FullName)) - CHARINDEX(' ', FullName) + 1) FirstName,
RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) AS Last_Name,
LEN(SUBSTRING(FullName, CHARINDEX(' ', FullName), LEN(FullName) - CHARINDEX(' ', REVERSE([FullName)) - CHARINDEX(' ', FullName) + 1)) AS FirstNameChar
FROM
Names WITH (NOLOCK)
WHERE
(FullName LIKE 'Mr %' OR
FullName LIKE 'Mrs %' OR
FullName LIKE 'Miss %' OR
FullName LIKE 'Ms %' OR
FullName LIKE 'Dr %')
电流输出:
ID | 全名 | 字首 | 名 | 姓 | 名字字符 |
---|---|---|---|---|---|
123456 | 圣费内克先生 | 先生 | 英石 | 费内克 | 4 |
所需输出:
ID | 全名 | 字首 | 名 | 中间名字 | 姓 | 名字字符 |
---|---|---|---|---|---|---|
123456 | 圣费内克先生 | 先生 | s | 吨 | 费内克 | 1 |
我想从名字和姓氏之前删除空格,因为可以看到 FirstNameChar 是 4 而实际上应该是 1 并且能够拆分中间名。
任何人都可以帮助解决这个问题吗?
参考stackoverflow上的问题: SQL- Get the substring after first space and second space in separate columns
解决方案
此查询适用于所有组合。由于带有空格的前缀是强制性的,因此可以检查带有前缀的 (first_name) 或 (first_name & last_name) 或 (first_name & middle_name & last_name)。
SELECT TOP 10
ID
, FullName
, SUBSTRING(FullName, 1, CHARINDEX(' ', FullName) - 1) Prefix
, CASE WHEN CHARINDEX(' ', FullName) = 0
THEN NULL
ELSE SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, (CASE WHEN CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) = 0
THEN LEN(FullName)
ELSE CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) - 1
END))
END FirstName
, CASE WHEN CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) + 1 + CHARINDEX(' ', FullName), LEN(FullName))) = 0
THEN NULL
ELSE SUBSTRING(FullName, CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) + 1 + CHARINDEX(' ', FullName),
CASE WHEN CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) = 0
THEN LEN(FullName)
ELSE ((CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) + 1 + CHARINDEX(' ', FullName), LEN(FullName)))) - 1) END)
END MiddleName
, CASE WHEN (CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) + 1 + CHARINDEX(' ', FullName), LEN(FullName))) > 0
OR CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) > 0)
THEN CASE WHEN CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) + 1 + CHARINDEX(' ', FullName), LEN(FullName))) + 1 + CHARINDEX(' ', FullName) + CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))), LEN(FullName))) = 0
THEN RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1)
ELSE SUBSTRING(FullName, CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) + 1 + CHARINDEX(' ', FullName), LEN(FullName))) + 1 + CHARINDEX(' ', FullName) + CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))), LEN(FullName))
END
ELSE NULL
END LastName
, LEN(CASE WHEN CHARINDEX(' ', FullName) = 0
THEN NULL
ELSE SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, (CASE WHEN CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) = 0
THEN LEN(FullName)
ELSE CHARINDEX(' ', SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))) - 1
END))
END) FirstNameChar
FROM dbo.fullNameTest
WHERE
(FullName LIKE 'Mr %' OR
FullName LIKE 'Mrs %' OR
FullName LIKE 'Miss %' OR
FullName LIKE 'Ms %' OR
FullName LIKE 'Dr %');
还要检查这个网址https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=b4a02827d400ac4cadad852bbae96c57
推荐阅读
- java - 如何在 android studio 中的活动之间共享数组列表?
- java - NoClassDefFoundError:org/w3c/dom/ls/DocumentLS - 在编译时修复后仅在部署时发生的问题
- snowflake-cloud-data-platform - 无法将变体值“”转换为 TIMESTAMP_NTZ
- java - 回收站视图显示为空而不是显示图像?
- python - 毫米:ss 格式的 PyQt 倒数计时器
- azure - Azure 语音识别未检测到麦克风 SPXERR_MIC_NOT_FOUND
- python - BotBuilder Python - 处理多个对话和意图
- flutter - 如何在flutter中保存数据?
- c# - 如何在 ASP.NET CORE MVC 应用程序中为多个表创建 ViewModel?
- reactjs - 我通过这个 Reddit API 映射错误吗?无打印