SQL Query在具有多个括号的字符串中获取[]之间的子字符串

时间:2016-10-17 16:33:03

标签: sql sql-server substring

我有一个名为" Formula"的文本字符串的列,其中变量用ID编码并设置为括号,括号中的文本长度可以不同,这些括号的数量实际上是无限的。数据示例:

  • public abstract class MyBaseFragment extends Fragment { private FloatingActionButton fab; protected void initFab(View contentView, int resourceId) { fab = (FloatingActionButton) contentView.findViewById(resourceId); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { launchDetailsDialogFragment(); } }); } protected abstract void launchDetailsDialogFragment(); }
  • [a=5;b=1;c=15]
  • [x=1;a=5;b=1;c=15]*[a=4;c=2]

我寻找=IF([a=10232937;c=227634]=1;[a=2;b=51;d=14]*[a=1;b=51;d=14];0)a的特定组合,比如说:

c

结果将为Select Formula FROM Table WHERE Formula LIKE "%a=5%c=2%" ,但在这种情况下[x=1;a=5;b=1;c=15]*[a=4;c=2]a=5位于不同的括号中,所需的结果实际上为空。

关于如何在任何给定括号内查看的任何想法?

UPD:它是SQL Server 2014

2 个答案:

答案 0 :(得分:0)

简单的Parse / Split功能可以在这里提供帮助

Declare @YourTable table (ID int, Formula varchar(max))
Insert Into @YourTable values
(1,'[a=5;b=1;c=15]'),
(2,'[x=1;a=5;b=1;c=15]*[a=4;c=2]'),
(3,'=IF([a=10232937;c=227634]=1;[a=2;b=51;d=14]*[a=1;b=51;d=14];0')

Select Distinct A.*
 From  @YourTable A
 Cross Apply [dbo].[udf-Str-Parse](A.Formula,']')  B
 Where RetVal Like '%a=5%c=2%'

返回NO DATA

虽然 Where RetVal Like '%a=1%c=2%'

<强>返回

ID  Formula
3   =IF([a=10232937;c=227634]=1;[a=2;b=51;d=14]*[a=1;b=51;d=14];0

UDF如果需要(如果你不能使用UDF,逻辑也可以移植到Cross Apply中)

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = Row_Number() over (Order By (Select null))
          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
    From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
);

答案 1 :(得分:0)

假设变量总是带有方括号。以下代码检查[]之间的a=5c=2

declare @table table
(
Formula varchar(max)
)

Insert into @table values ('[x=1;a=5;b=1;c=15]*[a=4;c=2]');
Insert into @table values ('[x=1;a=5;b=1;c=15;a=4;c=2]');

declare @search1 varchar(100) = 'a=5'
declare @search2 varchar(100) = 'c=2'

SELECT Formula
FROM (
Select Formula
, CHARINDEX('[', (SUBSTRING(Formula, CHARINDEX(@search1, Formula), CHARINDEX(@search2, Formula) - CHARINDEX(@search1, Formula)))) LeftPar
, CHARINDEX(']', (SUBSTRING(Formula, CHARINDEX(@search1, Formula), CHARINDEX(@search2, Formula) - CHARINDEX(@search1, Formula)))) RightPar
from @table
WHERE Formula like '%\[%\]%' ESCAPE '\'
) x
Where LeftPar = 0 AND RightPar = 0

--Output
--[x=1;a=5;b=1;c=15;a=4;c=2]