首页 > 解决方案 > 在 SQL Server 中拆分前缀、名字、中间名和姓氏中的全名

问题描述

我正在尝试使用 SQL Server和 、 和Prefix拆分First Name全名。Middle NameLast 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

SQL:从全名字段中解析名字、中间名和姓氏

从全名解析前缀 First Middle Last Suffix

标签: sql-serverparsingsubstringcharindex

解决方案


此查询适用于所有组合。由于带有空格的前缀是强制性的,因此可以检查带有前缀的 (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


推荐阅读