2017-07-13 9 views
1

長さの異なる長い文字列を含む説明列があり、その文字列の角括弧の間にある内容を抽出します。SQL:SELECT文を使用して、その文字列のすべての角括弧の間にあるすべての部分文字列を抽出します。

最初の括弧のペアで見つかったコンテンツを抽出できますが、大括弧のペアが見つかった場合はどのように対処するかわかりません。

できるだけSELECT文を使用したいと思います。

私のクエリはこれまでのところは、以下のデータを持つ例えば、この

SELECT SUBSTRING (Description, CHARINDEX('[', Description)+1, CHARINDEX(']', Description)-CHARINDEX('[', Description)-1) 
FROM [MyTable].[Description] 
WHERE Description like '%(%' 

のように見えます

説明(列)

行1 blablablablalbaalala(blibliblobloblo)blalblalala(blululublululu)

私のクエリは 'blibliblobloblo'を返すだけですが、私は 'blululublululu'もしたいです

+0

SQL Serverののバージョンは? 2016年以前? – gbn

+0

これを確認してくださいhttps://stackoverflow.com/questions/4843121/how-to-extract-multiple-strings-from-single-rows-in-sql-server –

+0

大括弧 '[]'を含むテキストを探していますかまたは '()'をかっこで囲みますか? – Jason

答えて

1

のSQL Server 2016と

DECLARE @foo varchar(100) = 'lablablablalbaalala (blibliblobloblo) blalblalala (blululublululu)' 

SELECT 
    LEFT(value, CHARINDEX(')', value)-1) 
FROM 
    STRING_SPLIT(@foo, '(') 
WHERE 
    value LIKE '%)%' 
+0

私は2014年を申し訳ありません。 – Manny

0

上記のあなたは、TVF(表値関数)を開いている場合。

文字列の抽出に疲れました(charindex、left、right、...)私は、2つの非類似区切り文字を受け入れるように解析関数を変更しました。あなたの場合、これはになります。

Declare @YourTable table (ID int,SomeCol varchar(max)) 
Insert Into @YourTable values 
(1,'blablablablalbaalala (blibliblobloblo) blalblalala (blululublululu)') 

Select A.ID 
     ,B.* 
From @YourTable A 
Cross Apply [dbo].[udf-Str-Extract](A.SomeCol,'(',')') B 

戻り

ID RetSeq RetPos RetVal 
1 1  23  blibliblobloblo 
1 2  53  blululublululu 

UDF興味があれば

CREATE FUNCTION [dbo].[udf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100)) 
Returns Table 
As 
Return ( 

with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cte2(N) As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A), 
     cte3(N) As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1), 
     cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S) 

Select RetSeq = Row_Number() over (Order By N) 
     ,RetPos = N 
     ,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1) 
From (
     Select *,RetVal = Substring(@String, N, L) 
     From cte4 
     ) A 
Where charindex(@Delimiter2,RetVal)>1 

) 
/* 
Max Length of String 1MM characters 

Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...' 
Select * From [dbo].[udf-Str-Extract] (@String,'[[',']]') 
*/ 
関連する問題