【问题标题】:Extracting part of name from string从字符串中提取部分名称
【发布时间】:2020-04-01 10:02:17
【问题描述】:

我试图从包含全名格式的名称列中提取姓氏、名字、中间名。

这是我要提取的示例名称:

DELA CRUZ, JUAN PONCE SR. ENRILE
ATIENZA, ROBERTO JR. SANTO
GONZA, MARK ANTHONY, DELLY-LO

我想像这样提取它们:

    LastName    | FirstName       | MiddleName
    DELA CRUZ   | JUAN PONCE SR.  | ENRILE
    ATIENZA     | ROBERTO JR.     | SANTOS
    GONZA       | MARK ANTHONY    | DELLY

这是我目前的脚本

DECLARE @Name    VARCHAR(50) = 'DELA CRUZ, JUAN PONCE SR. ENRILE'

SELECT
SUBSTRING(@Name, 0, CharIndex(',', @Name)) LastName,
REVERSE(LEFT(REVERSE(@Name), CharIndex(' ', reverse(@Name))-1)) MiddleName

我在提取带有 -LO 后缀的中间时也遇到了问题。

谢谢

【问题讨论】:

  • 我希望您现在已经学会了永远不要将数据存储为逗号分隔值。
  • 在考虑名称时,this 是有价值的阅读
  • @jarlh 是的,提取这种数据很痛苦,但我不是设计这个数据库的人
  • 你说-LO有问题,你想怎么处理?看起来你只是想忽略它,所以你正在改变人们的名字,那么?
  • 抱歉忘了说 -LO 不是他们名字的一部分

标签: sql sql-server


【解决方案1】:

字符串操作是 SQL Server 中的一大难题。如果必须使用它们,我建议使用APPLY 来定义中间值:

select v1.lastname, rest, 
       (case when v1.rest like '%,%'
             then left(rest, charindex(',', rest) - 1)
             else left(rest, len(rest) - charindex(' ', reverse(rest)))
        end) as firstname,
       (case when v1.rest like '%,%'
             then stuff(rest, 1, charindex(',', rest) + 1, '')
             else stuff(rest, 1, len(rest) - charindex(' ', reverse(rest)) + 1, '')
        end) as lastname
from t cross apply
     (values (left(names, charindex(',', names) - 1), stuff(names, 1, charindex(',', names) + 1, ''))
     ) v1(lastname, rest);

Here 是一个 dbfiddle。

【讨论】:

    【解决方案2】:

    试试下面这个逻辑(修改你的)

    DECLARE @Name    VARCHAR(50) = 'DELA CRUZ, JUAN PONCE SR. ENRILE'
    
    SELECT
    SUBSTRING(@Name, 0, CharIndex(',', @Name)) LastName,
    REVERSE(SUBSTRING(REVERSE(RIGHT(@Name,LEN(@Name)-CharIndex(',', @Name))), 0, CharIndex(' ', REVERSE(RIGHT(@Name,LEN(@Name)-CharIndex(',', @Name)))))) MiddleName,
    REPLACE(REVERSE(RIGHT(REVERSE(RIGHT(@Name,LEN(@Name)-CharIndex(',', @Name))),LEN(REVERSE(RIGHT(@Name,LEN(@Name)-CharIndex(',', @Name))))-CharIndex(' ', REVERSE(RIGHT(@Name,LEN(@Name)-CharIndex(',', @Name))))+1)),',','') FirstName         
    

    【讨论】:

    • 对这种名称格式 GONZA, MARK DELLY -LO 仍有问题。 Delly 应该是 MiddleName
    • 您的名字的输出是 - LastName - “GONZA” MiddleName - “Delly” FirstName - “MARK DELLY -LO”。不是预期的吗?
    • 在某些情况下,名字只有一部分,例如:Mark 和 MiddleName 是 DELLY -LO。它被读作 Mark Delly。没想到还会有这样的案例。还是谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多