我有一个名为" 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
答案 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=5
和c=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]