Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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 如何从全名中提取firstname、middle和LastName_Sql Server_Tsql_Substring - Fatal编程技术网

Sql server 如何从全名中提取firstname、middle和LastName

Sql server 如何从全名中提取firstname、middle和LastName,sql-server,tsql,substring,Sql Server,Tsql,Substring,如何从下面的示例中提取firstname、middlename和lastname 格式 FirstName,LastName可选middlenameorinitial 样本数据 詹姆斯,贝弗利B 马尔斯,克拉伦斯 麦考伊,简A 弗恩,盖尔·梅 我明白了 SUBSTRING((SUBSTRING(p.name, CHARINDEX(' ', p.name) + 1, 8000)), 1, CHARINDEX(' ', (SUBSTRING(p.name, CHARINDEX(' ', p.na

如何从下面的示例中提取firstname、middlename和lastname

格式

FirstName,LastName可选middlenameorinitial

样本数据

詹姆斯,贝弗利B

马尔斯,克拉伦斯

麦考伊,简A

弗恩,盖尔·梅

我明白了

  SUBSTRING((SUBSTRING(p.name, CHARINDEX(' ', p.name) + 1, 8000)), 1, CHARINDEX(' ', (SUBSTRING(p.name, CHARINDEX(' ', p.name) + 1, 8000))) - 1)as[PatientLastName]
  case 
       when LEN(LTRIM(rtrim(p.name))) - LEN(replace(ltrim(rtrim(p.name)),' ','')) = 2
       then REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(p.name))),1,CHARINDEX(' ',REVERSE(LTRIM(RTRIM(p.name))))))
       else ''end as[PatientMiddleName]
  ,Replace(LEFT(p.Name,CHARINDEX(' ',p.Name)-1),',','') as PatientFirstName

我想你会发现这很有用

create table #temp 
( 
    FULLNAME        VARCHAR(100), 
    ID              INT 
) 

INSERT INTO #TEMP VALUES ('TUCKER, KEVIN G', 1) 
INSERT INTO #TEMP VALUES ('SCOTT, JOHN', 2) 
INSERT INTO #TEMP VALUES ('ERIC, T W', 3) 
INSERT INTO #TEMP VALUES ('MUNICH, SMITH D', 4) 
INSERT INTO #TEMP VALUES ('LYOD SR, CLIVE G', 5) 
INSERT INTO #TEMP VALUES ('HANSEN JR, CHARLES S', 6) 
INSERT INTO #TEMP VALUES ('BROWN,SHERMAN', 7) 
INSERT INTO #TEMP VALUES ('ANDREWS III, CLARK A', 8) 
INSERT INTO #TEMP VALUES ('MAMMTAN, MARY LOU', 9) 

DECLARE  @Suffixes  TABLE( 
                          Suffix VARCHAR(5) 
                          ) 

INSERT INTO @Suffixes 
VALUES     ('I'), 
           ('II'), 
           ('III'), 
           ('IV'), 
           ('V'), 
           ('SR'), 
           ('JR'), 
           ('1st'), 
           ('2nd'), 
           ('3rd') 

SELECT T.id, 
       T.Fullname, 
       F7.*, 
       F4.[LAST Name], 
       F4.Suffix 
FROM   #temp T 
       CROSS APPLY (SELECT LEFT(T.FullName,CHARINDEX(',',T.FULLNAME + ',') - 1) AS cLastName,
                           LTRIM(SUBSTRING(T.FullName,CHARINDEX(',',T.FULLNAME + ',') + 1, 
                                           LEN(T.FullName))) AS cFirstName) F1 
       CROSS APPLY (SELECT LEFT(F1.cLastName,CHARINDEX(' ',F1.cLastName + ' ') - 1) AS LName,
                           SUBSTRING(F1.cLastName,CHARINDEX(' ',F1.cLastName + ' ') + 1, 
                                     LEN(F1.cLastName)) AS pSuffix) F2 
       CROSS APPLY (SELECT CASE 
                             WHEN LEN(pSuffix) > 0 
                                  AND EXISTS (SELECT 1 
                                              FROM   @Suffixes S 
                                              WHERE  S.Suffix = pSuffix) THEN 'Y' 
                             ELSE 'N' 
                           END AS SuffixExists) F3 
       CROSS APPLY (SELECT CASE 
                             WHEN F3.SuffixExists = 'Y' THEN F2.LName 
                             ELSE RTRIM(F2.LName + ' ' + F2.pSuffix) 
                           END AS [LAST Name], 
                           CASE 
                             WHEN F3.SuffixExists = 'Y' THEN F2.pSuffix 
                             ELSE '' 
                           END AS [Suffix]) F4 
       CROSS APPLY (SELECT LEFT(F1.cFirstName,CHARINDEX(' ',F1.cFirstName + ' ') - 1) AS FName,
                           SUBSTRING(F1.cFirstName,CHARINDEX(' ',F1.cFirstName + ' ') + 1, 
                                     LEN(F1.cFirstName)) AS MInitial) F5 
       CROSS APPLY (SELECT CASE 
                             WHEN LEN(MInitial) = 1 THEN 'Y' 
                             ELSE 'N' 
                           END AS MIExists) F6 
       CROSS APPLY (SELECT CASE 
                             WHEN F6.MIExists = 'Y' THEN F5.FName 
                             ELSE RTRIM(F5.FName + ' ' + F5.MInitial) 
                           END AS [FIRST Name], 
                           CASE 
                             WHEN F6.MIExists = 'Y' THEN F5.MInitial 
                             ELSE '' 
                           END AS [Middle Initial]) F7

在火星上,克拉伦斯·麦考伊,简A,哪一个是名字,中间名和姓氏?另外,我有两个中间名。除非明确要求,否则我从不提及它们,部分原因是为了防止这样的数据集出现问题。总有一天我们会有名字的。有一天…Jane是名字,Mccoy是姓氏,A是中间名多个中间名或名称部分实际上非常常见,特别是在其他语言中,如荷兰语。这就是为什么这种类型的东西如此有问题的另一个例子。至少有一行没有逗号,charindex为-1。
create table #temp 
( 
    FULLNAME        VARCHAR(100), 
    ID              INT 
) 

INSERT INTO #TEMP VALUES ('TUCKER, KEVIN G', 1) 
INSERT INTO #TEMP VALUES ('SCOTT, JOHN', 2) 
INSERT INTO #TEMP VALUES ('ERIC, T W', 3) 
INSERT INTO #TEMP VALUES ('MUNICH, SMITH D', 4) 
INSERT INTO #TEMP VALUES ('LYOD SR, CLIVE G', 5) 
INSERT INTO #TEMP VALUES ('HANSEN JR, CHARLES S', 6) 
INSERT INTO #TEMP VALUES ('BROWN,SHERMAN', 7) 
INSERT INTO #TEMP VALUES ('ANDREWS III, CLARK A', 8) 
INSERT INTO #TEMP VALUES ('MAMMTAN, MARY LOU', 9) 

DECLARE  @Suffixes  TABLE( 
                          Suffix VARCHAR(5) 
                          ) 

INSERT INTO @Suffixes 
VALUES     ('I'), 
           ('II'), 
           ('III'), 
           ('IV'), 
           ('V'), 
           ('SR'), 
           ('JR'), 
           ('1st'), 
           ('2nd'), 
           ('3rd') 

SELECT T.id, 
       T.Fullname, 
       F7.*, 
       F4.[LAST Name], 
       F4.Suffix 
FROM   #temp T 
       CROSS APPLY (SELECT LEFT(T.FullName,CHARINDEX(',',T.FULLNAME + ',') - 1) AS cLastName,
                           LTRIM(SUBSTRING(T.FullName,CHARINDEX(',',T.FULLNAME + ',') + 1, 
                                           LEN(T.FullName))) AS cFirstName) F1 
       CROSS APPLY (SELECT LEFT(F1.cLastName,CHARINDEX(' ',F1.cLastName + ' ') - 1) AS LName,
                           SUBSTRING(F1.cLastName,CHARINDEX(' ',F1.cLastName + ' ') + 1, 
                                     LEN(F1.cLastName)) AS pSuffix) F2 
       CROSS APPLY (SELECT CASE 
                             WHEN LEN(pSuffix) > 0 
                                  AND EXISTS (SELECT 1 
                                              FROM   @Suffixes S 
                                              WHERE  S.Suffix = pSuffix) THEN 'Y' 
                             ELSE 'N' 
                           END AS SuffixExists) F3 
       CROSS APPLY (SELECT CASE 
                             WHEN F3.SuffixExists = 'Y' THEN F2.LName 
                             ELSE RTRIM(F2.LName + ' ' + F2.pSuffix) 
                           END AS [LAST Name], 
                           CASE 
                             WHEN F3.SuffixExists = 'Y' THEN F2.pSuffix 
                             ELSE '' 
                           END AS [Suffix]) F4 
       CROSS APPLY (SELECT LEFT(F1.cFirstName,CHARINDEX(' ',F1.cFirstName + ' ') - 1) AS FName,
                           SUBSTRING(F1.cFirstName,CHARINDEX(' ',F1.cFirstName + ' ') + 1, 
                                     LEN(F1.cFirstName)) AS MInitial) F5 
       CROSS APPLY (SELECT CASE 
                             WHEN LEN(MInitial) = 1 THEN 'Y' 
                             ELSE 'N' 
                           END AS MIExists) F6 
       CROSS APPLY (SELECT CASE 
                             WHEN F6.MIExists = 'Y' THEN F5.FName 
                             ELSE RTRIM(F5.FName + ' ' + F5.MInitial) 
                           END AS [FIRST Name], 
                           CASE 
                             WHEN F6.MIExists = 'Y' THEN F5.MInitial 
                             ELSE '' 
                           END AS [Middle Initial]) F7