Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询以获取带多个括号的字符串中[]之间的子字符串_Sql_Sql Server_Substring - Fatal编程技术网

SQL查询以获取带多个括号的字符串中[]之间的子字符串

SQL查询以获取带多个括号的字符串中[]之间的子字符串,sql,sql-server,substring,Sql,Sql Server,Substring,我有一个名为Formula的文本字符串列,其中变量用id编码并设置为括号,括号中的文本长度可能不同,这样的括号的数量实际上是无限的。数据示例: [a=5;b=1;c=15] [x=1;a=5;b=1;c=15]*[a=4;c=2] =如果[a=10232937;c=227634]=1;[a=2;b=51;d=14]*[a=1;b=51;d=14];0 我寻找a和c的特定组合,比如: 结果将是[x=1;a=5;b=1;c=15]*[a=4;c=2],尽管在这种情况下,a=5和c=2位于不同的括号中

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

[a=5;b=1;c=15] [x=1;a=5;b=1;c=15]*[a=4;c=2] =如果[a=10232937;c=227634]=1;[a=2;b=51;d=14]*[a=1;b=51;d=14];0 我寻找a和c的特定组合,比如:

结果将是[x=1;a=5;b=1;c=15]*[a=4;c=2],尽管在这种情况下,a=5和c=2位于不同的括号中,并且期望的结果实际上是空的

关于如何在给定的括号内查看,有什么想法吗


UPD:这是SQL Server 2014

一个简单的解析/拆分函数可以在这里提供帮助

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%'
不返回任何数据

而其中RetVal类似于“%a=1%c=2%”

返回

如果不能使用UDF,则还可以将UDF if needed逻辑移植到交叉应用程序中

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)
);

假设变量总是用方括号括起来。下面的代码正在检查a=5和c=2之间的[和]


UPD:这是SQL Server 2014您能解释一下为什么%a=5%c=2%不能满足您的需求吗?是否仅当它位于某个括号[]内时才需要它?处理此问题的最佳方法是停止在数据库中存储分隔值。这违反了1NF,是一个需要处理的严重问题。如果您有一个字符串拆分器,您可以在]上拆分它,然后在每个解析集内查找是否存在。这里有几个优秀的拆分器。查找TSQL拆分函数谢谢,但不幸的是,查询在子字符串或左/右pari中返回错误。如果没有得到任何错误,请使用示例数据更新查询。请运行并验证。我想这里有一个假设,即括号前面总是有c=NUM]。实际上,c=NUM也可以位于中间[a=4;c=5;b=1]*[a=6;c=4;b=1]这很有效,谢谢!您还知道字符串的解决方案吗?在其他括号中插入了一些括号?我指的是这样的数据:[a=5;b=[a=4;b=1;c=2];c=15]@很抱歉,此解决方案不会捕获嵌套的[]。我再煮一点面条。
ID  Formula
3   =IF([a=10232937;c=227634]=1;[a=2;b=51;d=14]*[a=1;b=51;d=14];0
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)
);
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]