提取名字和姓氏

时间:2011-02-28 18:09:01

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

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

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

但它给我的错误说:

Msg 537,Level 16,State 2,Line 1 传递给LEFT或SUBSTRING函数的长度参数无效。

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

名称:

霍普金斯

我该如何处理?

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

原始代码存在问题:

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建议的查询相同的结果,但(在我看来)它更容易阅读,更容易理解。

答案 2 :(得分:-4)

我们也可以使用locate函数

选择 名称,  LEFT(姓名,找到('',姓名)-1)AS FIRST_NAME, SUBSTRING(姓名,找到('',姓名)+ 1,LENgth(姓名))AS LAST_NAME 从测试