【问题标题】:Parsing first middle and last name解析第一个中间名和姓氏
【发布时间】:2018-09-12 14:08:06
【问题描述】:

我有一个从全名解析名字、中间名和姓氏的查询。

DECLARE @name VARCHAR(20) = 'martin'

SELECT first_name = (
        CASE LEN(REPLACE(UPPER(@name), ' ', ''))
            WHEN LEN(UPPER(@name)) - 1
                THEN PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 2)
            ELSE PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 3)
            END
        )
    ,mi = (
        CASE LEN(REPLACE(UPPER(@name), ' ', ''))
            WHEN LEN(UPPER(@name)) - 1
                THEN NULL
            ELSE PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 2)
            END
        )
    ,last_name = (PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 1))

所以问题是,当输入名字和姓氏时,这个查询可以正常工作。就像@name = 'Martin Joe' 工作正常。但是当输入是单个名称 @name = 'Martin' 时,它会将其设为姓氏并首先抛出 MI 为空。

当前输出:

@name = 'Martin'
First name - Null
MI - Null
Last name - Martin

期望的输出:

@name = 'Martin'
First name - Martin
MI - Null
Last name - Null

它应该将名字显示为'Martin,MI 和姓氏为空。有什么帮助吗?!

【问题讨论】:

  • 遇到@name = 'Smith'怎么办?
  • @Rick Peter B 的观点是,在 那个 的情况下,你得到它作为姓氏的事实可能是正确的。多考虑您的要求。
  • 你不知道你打开了什么样的蠕虫罐头。
  • SQL 中已经有一个关于名称的bunch of SO questions。但是,您更大的问题似乎是对名称的幼稚理解。不符合First Middle Last 模式的名称怎么办?在许多亚洲国家,姓氏是第一位的。在许多讲西班牙语的国家,一个人可以有多个姓氏(可能有也可能没有连字符——例如Jose Aruego Castilles Cervantes)。你读过kalzumeus.com/2010/06/17/…吗?

标签: sql sql-server


【解决方案1】:

听起来您只想颠倒查询顺序(名字和姓氏翻转),这对您有用吗?

DECLARE @name VARCHAR(20) = 'Martin Joe'

SELECT last_name = (
        CASE LEN(REPLACE(UPPER(@name), ' ', ''))
            WHEN LEN(UPPER(@name)) - 1
                THEN PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 2)
            ELSE PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 3)
            END
        )
    ,mi = (
        CASE LEN(REPLACE(UPPER(@name), ' ', ''))
            WHEN LEN(UPPER(@name)) - 1
                THEN NULL
            ELSE PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 2)
            END
        )
    ,first_name = (PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 1))

这个输入

DECLARE @name VARCHAR(20) = 'Martin Joe'

愿意(我猜 Joe 在这种情况下应该是 fname?)

lname   mi      fname
MARTIN  NULL    JOE

还有这个(现在 Martin 在这种情况下是第一个名字?)

DECLARE @name VARCHAR(20) = 'Martin'

愿意:

lname   mi      fname
NULL    NULL    MARTIN

顺便说一句,我使用了有问题的原始 SQL 代码并使用:http://poorsql.com/ 对其进行格式化,这很方便:)

【讨论】:

    【解决方案2】:

    您需要在 first_name CASE 中添加一个额外的 WHEN 以说明折叠字符串和原始字符串的长度相同,因此这种情况将被视为名字。然后在 last_name 上必须有一个CASE 以确保折叠的字符串和原始字符串的长度不同。

    这似乎有效:

    DECLARE @name VARCHAR(20) = 'martin'
    
    
    SELECT first_name = (
            CASE LEN(REPLACE(UPPER(@name), ' ', ''))
                WHEN LEN(UPPER(@name)) - 1
                    THEN PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 2)
                WHEN LEN(@name) 
                    THEN PARSENAME('..' + UPPER(@name), 1)
                ELSE PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 3)
                END
            )
        ,mi = (
            CASE LEN(REPLACE(UPPER(@name), ' ', ''))
                WHEN LEN(UPPER(@name)) - 1
                    THEN NULL
                ELSE PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 2)
                END
            )
        ,last_name = 
            CASE 
              WHEN LEN(REPLACE(UPPER(@name), ' ', '')) < LEN(UPPER(@name))
                  THEN (PARSENAME(REPLACE(UPPER(@name), ' ', '.'), 1))
              ELSE NULL
            END 
    

    【讨论】:

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