2016-09-27 52 views
-1

我知道如何在T-SQL中執行左,右和子字符串,但由於名稱的長度不同,我無法僅提取下面的人的名字。我可以用來提取名稱的任何想法或語法?由於選擇人名從右側開始

數據值:

581;#Jackson, Daniel H; 501;#Sims, Katy L; 606;#Lawrence, Jennifer O 
+1

什麼是數據值'581的預期輸出; #Jackson,丹尼爾·H; 501; #Sims,Katy L; 606;#勞倫斯,詹妮弗奧? –

+0

其實它是一個SELECT

。我想知道除了LEFT,SUBSTRING或RIGHT之外是否還有其他SQL語法。結果應該只是姓氏,名字和首字母。 – Arsee

+0

因此,在給定的例子中,有3行從您的查詢'SELECT FROM

'獲得,它們是'581; #Jackson,Daniel H;','501; #Sims,Katy L;'和'606; #勞倫斯,詹妮弗奧?目前還不清楚您使用的是哪個字段。我建議您通過添加原始查詢並重新格式化輸出_Data Value_來編輯您的帖子。 –

回答

0

你可以動態使用PATINDEX名稱的長度,但它假定的名稱總是格式化一樣。

這裏是一個TSQL選擇的一個例子,這將使選擇您所提供的數據的第一個名字:

CREATE TABLE #Temp (
    ID INT NOT NULL, 
    FullName VARCHAR(100) 
) 
INSERT #Temp VALUES (581, 'Jackson, Daniel H') 
INSERT #Temp VALUES (606, 'Lawrence, Jennifer O') 

SELECT ID, FullName , SUBSTRING(FullName, PATINDEX('%, % _', FullName) + 2, 
    PATINDEX('% _', FullName) - PATINDEX('%, %', FullName) - 2) FirstName 
FROM #Temp 
DROP TABLE #Temp 
0

我用一個函數來拆分CSV串:

create function Do_Split 
    (@InputString NVARCHAR(4000) 
    ,@Delimiter NVARCHAR(50) = ';') 
RETURNS @Items TABLE (Item NVARCHAR(4000)) AS 

BEGIN --Function 
IF (@Delimiter = ' ') 
BEGIN 
    SET @Delimiter = ';' 
    SET @InputString = REPLACE(@InputString, ' ', @Delimiter) 
END; 

IF (@Delimiter IS NULL OR @Delimiter = '') SET @Delimiter = ';'; 

DECLARE @Item   NVARCHAR(4000) 
DECLARE @ItemList  NVARCHAR(4000) 
DECLARE @DelimIndex INT 

SET @ItemList = @InputString; 
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0); 
WHILE (@DelimIndex != 0) 
    BEGIN 
    SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex); 
    INSERT INTO @Items VALUES (@Item); 

-- Set @ItemList = @ItemList minus one less item 
    SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)[email protected]); 
    SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0); 
    END; -- End WHILE 

IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString 
    BEGIN 
    SET @Item = @ItemList; 
    INSERT INTO @Items VALUES (@Item); 
    END; 
ELSE  -- No delimiters were encountered in @InputString, so just return @InputString 
    BEGIN 
    INSERT INTO @Items VALUES (@InputString); 
    END; 

RETURN 
END -- End Function 
go 

用法:

SELECT * FROM Do_Split('581;#Jackson, Daniel H; 501;#Sims, Katy L; 606;#Lawrence, Jennifer O',';'); 

結果:

581 
#Jackson, Daniel H 
501 
#Sims, Katy L 
606 
#Lawrence, Jennifer O 
0

由於您的示例在一行中連接了多個值,因此不清楚數據的外觀。

案例1

假設有2分是列idyour_tablefull_name。分號;是有意添加的,用於區分列。在這種情況下,您可以使用功能RIGHT獲取全名的值。長度將是full_name減去1的長度,其不包括#

-- 
-- id full_name 
-- -- --------- 
-- 581 #Jackson, Daniel H 
-- 501 #Sims, Katy L 
-- 606 #Lawrence, Jennifer O 
-- 
SELECT RIGHT(full_name, LEN(full_name) - 1) AS full_name 
FROM your_table; 

案例2

如果上面的解決方案是不適合的,讓我們來討論另一種情況。假設your_table中有1列content和3行。分號爲;的值在content的值內,需要明確處理。在這種情況下,您可以使用功能SUBSTRING獲取全名的值。只是焦炭#的指數後後,全名開始,可以得到該指數使用CHARINDEX (Transact-SQL)

-- 
-- content 
-- ------- 
-- 581;#Jackson, Daniel H 
-- 501;#Sims, Katy L 
-- 606;#Lawrence, Jennifer O 
-- 
SELECT SUBSTRING(content, CHARINDEX('#', content) + 1, 1000) AS full_name 
FROM your_table; 
+0

上述解決方案有效!非常感謝你Mincong ..簡單的代碼.. :) – Arsee

+0

好消息@Arsee!我很高興能夠幫助你。你能接受我的回答嗎? –

+0

我如何接受您的答案?對不起,我正在熟悉網站結構。 – Arsee