2017-07-13 42 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,左,右,...)我修改解析函数接受两个不一样的分隔符。在你的情况下,这将是

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,'[[',']]') 
*/