【问题标题】:How to extract firstname, middle and lastame from a fullname如何从全名中提取名字、中间名和姓氏
【发布时间】:2017-11-02 19:13:41
【问题描述】:

如何从下面的示例中提取名字、中间名和姓氏。

格式

FirstName, LastName OptionalMiddleNameOrInitial

样本数据

詹姆斯,贝弗莉·B

火星,克拉伦斯

麦考伊,简·A

弗恩,盖尔梅

rtrim(ltrim(substring(NAME,1,CHARINDEX(',',NAME)-1))) AS LastName
ltrim(ltrim(substring(NAME,CHARINDEX(',',NAME)+2, len(NAME))))  AS FirstName 

【问题讨论】:

  • MARS, CLARENCE MCCOY, JANE A 中的名字、中间名和姓氏是什么?
  • 顺便说一句,我有两个中间名。除非明确要求,否则我从不提及它们,部分是为了防止此类数据集出现问题。有一天,我们将只有“名字”。一天……
  • Jane 是名字,Mccoy 是姓氏,A 是中间名
  • 多个中间名(或名称部分)实际上很常见,尤其是在其他语言中(如荷兰语)。
  • 这是为什么这类事情如此成问题的另一个例子。您至少有 1 行没有逗号,并且 charindex 为 -1。

标签: sql-server tsql substring


【解决方案1】:

我想通了

  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

【讨论】:

    【解决方案2】:

    我想你会发现这很有用。

    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
    

    http://blogs.lessthandot.com/index.php/datamgmt/datadesign/parsing-fullname-field-to-individual/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2010-09-14
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多