【问题标题】:Extracting First Name and Last Name提取名字和姓氏
【发布时间】:2011-02-28 18:09:00
【问题描述】:

我在名为 test 的表中有一个名为 Name 的列,该表具有全名,我正在尝试提取名字和姓氏。所以我写了这样的查询:

SELECT 
[Name],
 LEFT([Name],CHARINDEX(' ',[Name])-1)  AS FIRST_NAME,
SUBSTRING([Name],CHARINDEX(' ',[Name])+1,LEN([Name])) AS LAST_NAME
FROM Test

但它给了我错误提示:

消息 537,第 16 级,状态 2,第 1 行 传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

这是因为我的名字中有一些值,例如:

姓名:

霍普金斯

我该如何处理这些?

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql


    【解决方案1】:
    Declare @t table ( [Name] varchar(100) )
    
    insert into @t ( Name )
    VALUES ( 'dennis hopper' ), ('keanu reaves'), ('thatgirl') 
    
    SELECT
        [Name],
        CHARINDEX(' ', [Name]),
        CASE WHEN CHARINDEX(' ', [Name]) > 0 THEN
            LEFT([Name],CHARINDEX(' ',[Name])-1)
        ELSE
            [Name]
        END as FIRST_NAME,
        CASE WHEN CHARINDEX(' ', [Name]) > 0 THEN
            SUBSTRING([Name],CHARINDEX(' ',[Name])+1, ( LEN([Name]) - CHARINDEX(' ',[Name])+1) )
        ELSE
            NULL
        END as LAST_NAME
    FROM @t
    

    【讨论】:

    • 在这种情况下,我将 firstName 和 Last name 作为 Hopkins 我希望 First name 作为 Hopkins, Lastname 作为 Null
    • 我明白了,我只是用 Null 替换了姓氏中的 else 部分。非常感谢
    【解决方案2】:

    您的原始代码有问题:

    CHARINDEX(' ',[Name])-1
    

    如果 [Name] 不包含空格,则 CharIndex 返回 0。您减去 1 并将其输入到 Left 函数中。当左侧函数的第二个参数为 -1 时,您将收到此错误。在我看来,“解决”这个问题的最简单方法是给 CharIndex 函数提供一些东西,就像这样:

    CHARINDEX(' ',[Name] + ' ')-1
    

    现在...此代码不会失败。

    您只需要在原始代码中的一个地方执行此操作,但您也应该将其添加到 LAST_NAME 部分。如果你不这样做,你会得到不正确的结果(即使你不会得到错误)。

    SELECT [Name],
           LEFT([Name],CHARINDEX(' ',[Name] + ' ')-1)  AS FIRST_NAME,
           SUBSTRING([Name],CHARINDEX(' ',[Name] + ' ')+1,LEN([Name])) AS LAST_NAME
    FROM   Test
    

    此查询将返回与@Sage 建议的查询相同的结果,但(在我看来)它更易于阅读和理解。

    【讨论】:

      【解决方案3】:

      我们也可以使用定位功能

      选择 姓名, LEFT(Name,locate(' ',Name)-1) AS FIRST_NAME, SUBSTRING(Name,locate(' ',Name)+1,LENGth(Name)) AS LAST_NAME 来自测试

      【讨论】:

      • 这个问题是关于 SQL Server,而不是 MySQL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多