[英]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.