我有 NAME 列資料,例如
| 名稱 |
|---|
| 維多利亞·布朗 |
| 小山姆艾倫 |
| 雷·M·詹姆斯三世 |
我想根據名字,姓氏的空間數量進行拆分。這是我所做的,但最后一個 case 陳述句出錯了,當我們有 3 個空格時,它仍然得到后綴。
期待:
| 名稱 |
|---|
| 維多利亞·布朗 |
| 薩姆·艾倫 |
| 雷·詹姆斯 |
SELECT
LEN (NAME ) - LEN (REPLACE (NAME, ' ', '')),
CASE
WHEN LEN(NAME) - LEN(REPLACE(NAME, ' ', '')) = 1 THEN SUBSTRING(NAME, 1, CHARINDEX(' ', NAME) - 1)
WHEN LEN(NAME) - LEN(REPLACE(NAME, ' ', '')) = 2 THEN SUBSTRING (NAME, CHARINDEX(' ', NAME, (CHARINDEX(' ', NAME) 1)) 1, LEN(NAME))
WHEN LEN(NAME) - LEN(REPLACE(NAME, ' ', '')) = 3 THEN SUBSTRING (NAME, 1, CHARINDEX(' ', NAME) - 1)
END AS FIRSTNAME,
CASE
WHEN LEN(NAME) - LEN(REPLACE(NAME, ' ', '')) = 1 THEN SUBSTRING(NAME, CHARINDEX(' ', NAME) 1, LEN(NAME))
WHEN LEN(NAME) - LEN(REPLACE(NAME, ' ', '')) = 2 THEN SUBSTRING (NAME, 1, CHARINDEX(' ', NAME) - 1)
WHEN LEN(NAME) - LEN(REPLACE(NAME, ' ', '')) = 3 THEN SUBSTRING (NAME, CHARINDEX(' ', NAME, (CHARINDEX(' ', NAME) 1)) 1, LEN(NAME) - CHARINDEX(' ', NAME, (CHARINDEX(' ', NAME) 1)) 1)
END AS LASTNAME
FROM INFOS
uj5u.com熱心網友回復:
如果 string_split 在您的版本中可用
select * from infos cross apply ( select max(case when rn = 1 then value else '' end) as firstname , max(case when parts = 2 and rn = 2 then value when parts > 2 and rn = parts - 1 then value else '' end) as lastname from ( select value , rn = row_number() over (order by (select null)) , parts = count(*) over () from string_split(name, ' ') spl ) q ) ca;
| ID | 名稱 | 名 | 姓 |
|---|---|---|---|
| 1 | 維多利亞·布朗 | 維多利亞 | 棕色的 |
| 2 | 小山姆艾倫 | 山姆 | 艾倫 |
| 3 | 雷·M·詹姆斯三世 | 射線 | 詹姆士 |
關于db<>fiddle 的演示在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/379322.html
標籤:sql sql-server
