2016-09-27 5 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; #Lawrence、Jennifer O'? –

+0

実際にはより

です。私は、LEFT、SUBSTRING、RIGHTの他にSQL構文があるかどうかを知りたかったのです。結果は姓、名、頭文字でなければなりません。 – Arsee

+0

この例では、クエリ 'SELECT FROM

'から得られた3行があり、 '581; #Jackson、Daniel H;、501; #Sims、Katy L;および606; #Lawrence、Jennifer O'?あなたが使っている分野が明確ではありません。元のクエリを追加して投稿を編集し、_Data値_の出力を再フォーマットすることをお勧めします。 –

答えて

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つの行に連結しているため、データがどのように見えるかは不明です。

ケース1

は2列idfull_nameyour_tableにそこにいると仮定します。意図的に列を区別するためにセミコロン;が追加されました。この場合、関数RIGHTを使用してフルネームの値を取得することができます。長さはfull_nameの長さとなり、#は除きます。

-- 
-- 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と3行に1列のcontentがあるとします。セミコロン;contentの値の範囲内であり、明示的に処理する必要があります。この場合、関数SUBSTRINGを使用してフルネームの値を取得することができます。フルネームは、char #のインデックスと、このインデックスは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

関連する問題