2017-10-03 1 views
0
With T as 
( 
select 'Cytomegalovirus Nucleoside Analog DNA Polymerase Inhibitor [EPC],DNA Polymerase Inhibitors [MoA],Nucleoside Analog [Chemical/Ingredient],Nucleoside Analog Antiviral [EPC]' CLASS 
FROM DUAL) 

[EPC]で文字列を取得する必要があります。REGEXP_SUBSTR SQL Server

所望の出力:

Cytomegalovirus Nucleoside Analog DNA Polymerase Inhibitor [EPC], Nucleoside Analog Antiviral [EPC] 
+3

クライアント側で行うか、CLR関数を記述してください(正規表現とのマッチング方法については、オンラインでたくさんの例があります)。これを純粋なT-SQLで行うことは可能ですが、苦しみの練習です。 (SQL Server 2017を使用している場合を除き、 'STRING_SPLIT'と' STRING_AGG'は非常に簡単に実行できます) –

+0

私の例を使ってT-SQLコードを提供してください。 –

答えて

1

あなたの分割文字列リテラルであるので、あなたは、真の正規表現を必要としません。 SQL Serverの2017年には、これは動作するはずです(テストしていません):

SELECT STRING_AGG([value], ',') 
FROM STRING_SPLIT('Cytomegalovirus Nucleoside Analog DNA Polymerase Inhibitor [EPC],DNA Polymerase Inhibitors [MoA],Nucleoside Analog [Chemical/Ingredient],Nucleoside Analog Antiviral [EPC]', ',') 
WHERE [value] LIKE '%\[EPC\]%' ESCAPE '\' 

のSQL Server 2016には、(テスト)我々はSTRING_AGG欠けているが、我々はSTRING_SPLITを持っているので、これは動作します:

SELECT STUFF((
    SELECT ',' + [value] 
    FROM STRING_SPLIT('Cytomegalovirus Nucleoside Analog DNA Polymerase Inhibitor [EPC],DNA Polymerase Inhibitors [MoA],Nucleoside Analog [Chemical/Ingredient],Nucleoside Analog Antiviral [EPC]', ',') 
    WHERE [value] LIKE '%\[EPC\]%' ESCAPE '\' 
    FOR XML PATH('') 
), 1, 1, '') 

以前のバージョンでは、ネイティブの文字列分割がうまく実行されていないため、これが背後で大きな苦痛になりました。 this oneのように、多くの質問がこれを処理します。連結のためにFOR XML PATHトリックと組み合わせてこれらのソリューションのいずれかを使用すると動作します。

また、CLR関数では、よりクリーンで高速な(正規表現でも)CLR関数を実装できますが、それらを実装する方が複雑です。 This questionはそのための良いスタートです。

最後に、SQLでこれらの操作を実行する必要がある場合、これは通常、データベース設計が不足していることを示しています。特に、コンマ区切りの値は、EPC BIT NOT NULL列(またはより一般的にはCategoryID INT REFERENCES Categories(ID)列)の行に分かれている必要があります。また、クライアントコードのデータを効率的に操作する方法で考慮する必要がありますデータベース。ここでは正規化がキーワードです。