簡體   English   中英

提取名字和姓氏

[英]Extracting First Name and Last Name

我在名為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函數的長度參數無效。

這是因為我在名稱中有一些值,如:

名稱:

霍普金斯

我該如何處理?

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

原始代碼的問題在於:

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建議的查詢相同的結果,但(在我看來)它更容易閱讀,更容易理解。

我們也可以使用locate函數

SELECT Name,LEFT(名稱,locate('',Name)-1)AS FIRST_NAME,SUBSTRING(名稱,名稱('',姓名)+ 1,LENgth(姓名))AS LAST_NAME FROM測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM