我有一個名為 Name 的欄位,我將其分為第一個、最后一個和中間名首字母。我的查詢將其分為名字和姓氏,但名字包含中間名首字母。有些名字有一個中間的首字母,有些有它和一個句號,有些沒有,有些有一個完整的單詞,還有一些是不適用的組的名稱。這是我的查詢。
SELECT Name,
CASE WHEN Name LIKE '%,%' THEN REPLACE(SUBSTRING(Name, 1, (CHARINDEX(',', Name))), ',', '') ELSE Name END AS LastName,
CASE WHEN Name LIKE '%,%' THEN SUBSTRING(Name, (CHARINDEX(',', Name) 2), LEN(Name)) ELSE Name END AS FirstName
FROM Customer
我怎么能:
- 將我在名字列上的子字串更改為僅上升到該欄位中的空格
- 只將中間名的第一個字母放入 MI 欄位
當前結果

期望的結果

uj5u.com熱心網友回復:
好的,對不起,這是一個真正的黑客作業。
我通常的方法是在臨時表中進行處理 - 您使用一種方法更新符合某些條件的行;如果第一個沒有抓住它們,則使用另一種方法;并重復,直到你沒有剩下的(或只有手動修改的)。
對于這種情況,我以與您在問題中所做的類似方式完成了第一步(盡管我使用LEFT和STUFF來查找名稱組件 - 我發現它們的問題比 LEN 和有時 SUBSTRING 少)。
但是,我使用 CTE 中的這些結果作為下一步處理的輸入:如果名字有空格,則將其 LEFT 組件作為名字,然后將剩余部分的 LEFT(1) 獲取最初的。
在這種情況下,CTE 的操作類似于我對臨時表所做的操作。
這是一個db<>fiddle資料。
請注意,這里有一些額外空格的處理(使用 LTRIM 和 RTRIM),但它遠非完美。在下面的資料中,我還添加了額外的行,Cat, Sylvester The以更改間距作為示例。
CREATE TABLE #Names (FullName nvarchar(100));
INSERT INTO #Names (FullName) VALUES
('Duck, Daffy'),
('Bunny, Bugs F.'),
('Cartoon Network'),
('Doo, Scooby D'),
('Cat, Sylvester The'),
('Cat,Sylvester The'),
('Cat,Sylvester The');
WITH NameSplit AS
(SELECT FullName,
LTRIM(RTRIM(CASE WHEN FullName LIKE '%,%' THEN LEFT(FullName, CHARINDEX(',',FullName)-1) ELSE FullName END)) AS LastName,
LTRIM(RTRIM(CASE WHEN FullName LIKE '%,%' THEN STUFF(FullName, 1, CHARINDEX(',',FullName), '') ELSE FullName END)) AS NameRest
FROM #Names
)
SELECT FullName,
LastName,
CASE WHEN FullName LIKE '%,%' AND NameRest LIKE '% %' THEN LEFT(NameRest, CHARINDEX(' ', NameRest)-1) ELSE NameRest END AS FirstName,
CASE WHEN FullName LIKE '%,%' AND NameRest LIKE '% %' THEN LEFT(LTRIM(STUFF(NameRest, 1, CHARINDEX(' ', NameRest), '')), 1) ELSE '' END AS MiddleInitial
FROM NameSplit
結果
FullName LastName FirstName MiddleInitial
Duck, Daffy Duck Daffy
Bunny, Bugs F. Bunny Bugs F
Cartoon Network Cartoon Network Cartoon Network
Doo, Scooby D Doo Scooby D
Cat, Sylvester The Cat Sylvester T
Cat,Sylvester The Cat Sylvester T
Cat,Sylvester The Cat Sylvester T
uj5u.com熱心網友回復:
對于這些型別的清理,我采用的方法是通過使用子句來使用union all和劃分個人的決議邏輯。這種方法與您接受的答案并沒有太大不同,但我將其保留在那里以防您發現它有幫助selectwhere
with cte as
(select *,
trim(left(fullname,charindex(',',fullname ',')-1)) as fname,
trim(stuff(fullname,1,charindex(',',fullname),'')) as lname
from your_table)
select *, left(trim(stuff(lname,1,charindex(' ',lname),'')),1) as mid_init
from cte
where fullname like'%,%' and lname like '% %' --when it looks like we have a middle name
union all
select *,null
from cte
where fullname not like'%,%' or lname not like '% %' -- no middle name
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/521483.html
上一篇:更新表時物體框架截斷小數位
下一篇:將SQL陳述句撰寫為資料透視表?
