SQL Server:删除所有前缀,拆分第一个和第二个名称-提高代码质量
我有一个联系人列表,如下所示:SQL Server:删除所有前缀,拆分第一个和第二个名称-提高代码质量,sql,sql-server,Sql,Sql Server,我有一个联系人列表,如下所示: 联系方式: ID FirstName Lastname Email Title ------------------------------------------------------------------------------------ 1 Julia House aaaaaaa@yahoo.co.
联系方式
:
ID FirstName Lastname Email Title
------------------------------------------------------------------------------------
1 Julia House aaaaaaa@yahoo.co.uk
2 Mr Drew Pettifer drew@levales.com
3 Nicky Thomas nicky@nixsphoto.co.uk
4 Miss Al Cane alcane@talktalk.net
5 Mobile Communication Ltd sales@mobilecomms.com
6 Fire and Security Ltd
我有大约150000名客户,他们是公司和个人的混合体
我想把名字分开,去掉所有的前缀,把它们粘在标题里。任何组织,我都不介意他们只是一个名字,或者被两个组织分开
预期产出:
ID FirstName Lastname Email Title
-------------------------------------------------------------------------------------
1 Julia House aaaaaaa@yahoo.co.uk
2 Drew Pettifer drew@vales.com Mr
3 Nicky Thomas nicky@nixsphoto.co.uk
4 Al Cane alcane@test.net Miss
5 Mobile Communication Ltd sales@mobilecomms.com
6 Fire and Security Ltd
目前我有:
-- Update Title for all contacts with prefixes
UPDATE #TempContact
SET Title =
(SELECT REPLACE(LEFT(Firstname, CHARINDEX(' ', FirstName)), ' ', '')
FROM #TempContact TCC
WHERE #TempContact.ContactID = TCC.ContactID
AND (Firstname LIKE 'Mr %' OR
Firstname LIKE 'Mrs %' OR
Firstname LIKE 'Miss %' OR
Firstname LIKE 'Ms %' OR
Firstname LIKE 'Dr %')
)
-- Remove those prefixes and split the names
SELECT
SUBSTRING(FirstName, CHARINDEX(' ', FirstName) + 1, LEN(FirstName)),
SUBSTRING(FirstName, CHARINDEX(' ', FirstName, CHARINDEX(' ', FirstName) + 1), LEN(FirstName))
FROM
#TempContact
WHERE
Firstname LIKE 'Mr %' OR
Firstname LIKE 'Mrs %' OR
Firstname LIKE 'Miss %' OR
Firstname LIKE 'Ms %' OR
Firstname LIKE 'Dr %'
--After figuring this out, I intended to throw it inside the original update
我似乎无法仅获取前缀后的第一个实例(读取:仅限第二世界)
当然,也应该有一种更聪明的方式来写这篇文章——我真的很想听听你的想法
谢谢,试试这个
DECLARE @str VARCHAR(500)='Mr Sam'
SELECT Title,
first_name,
Substring(NAME, CASE
WHEN Charindex(' ', NAME) = 0 THEN 1
ELSE Charindex(' ', NAME)
END, Len(NAME)) last_name
FROM (SELECT CASE
WHEN LEFT(@str, Charindex(' ', @str)) IN( 'Mr', 'Mrs', 'Miss' ) THEN LEFT(@str, Charindex(' ', @str))
ELSE ''
END AS Title,
CASE
WHEN LEFT(@str, Charindex(' ', @str)) IN ( 'Mr', 'Mrs', 'Miss' ) THEN LEFT(Stuff(@str, 1, Charindex(' ', @str), ''), Charindex(' ', Stuff(@str, 1, Charindex(' ', @str), '')))
ELSE LEFT(@str, Charindex(' ', @str))
END AS first_name,
CASE
WHEN LEFT(@str, Charindex(' ', @str)) IN ( 'Mr', 'Mrs', 'Miss' ) THEN Stuff(@str, 1, Charindex(' ', @str), '')
ELSE @str
END NAME) a
首先,您必须从数据中删除问候语,以便可以通过以下方式执行此操作:-
UPDATE YOUR_TABLE
SET firstname = LTRIM(REPLACE(firstname, SUBSTRING(firstname, 1, CHARINDEX(' ', firstname)), ''))
FROM YOUR_TABLE
WHERE firstname LIKE 'Mr %' OR
firstname LIKE 'Mrs %' OR
firstname LIKE 'Miss %' OR
firstname LIKE 'Ms %' OR
firstname LIKE 'Dr %';
然后,您必须向名为lastname的表中再添加1列。并以以下方式向其添加数据:-
UPDATE YOUR_TABLE
SET lastname = SUBSTRING(firstname, CHARINDEX(' ', firstname), LEN(firstname)
这将从名字列中删除您的姓氏。然后您可以拆分您的列,以便
UPDATE YOUR_TABLE
SET firstname = LTRIM(SUBSTRING(firstname, 1, CHARINDEX(' ', firstname)));
我想这可能会对您有所帮助。哪一个是mysql还是sql server?@CoderofCode sql server在完成拆分之前,我不会修改原始值。这是因为我将在多个步骤中完成拆分,而不是在单个查询中完成拆分。为“first name”(临时)使用一个新列,将值放入其中;当您对结果感到满意时,删除原来的“FirstName”列,并将临时列重命名为“FirstName”;或者在新表中提取所需的列。嗨,有没有办法只处理名字?例如,John或Sam先生。这两种情况都会导致lastname。@DarkShadowAY-更新的检查now@NoDisplayName还是一样。[空白姓]山姆先生。应该是山姆先生[黑姓]@DarkShadowAY-你想让他成为你的姓??