Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:删除所有前缀,拆分第一个和第二个名称-提高代码质量_Sql_Sql Server - Fatal编程技术网

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-你想让他成为你的姓??