用于选择必须将来自另一个表的所有值作为子字符串的记录的SQL查询

时间:2014-11-19 10:14:30

标签: sql sql-server-2012

我有一张这样的表

Rules (RuleValue varchar(50))

它的值类似于

A1B1C1
A1B1C0
A1B0C0

还有另一张表

Input (RulePart varchar(2))

它可以包含以下值:

A1
B1
C1

我想获得所有RuleValues,其中所有RulePart都匹配RuleValue中的任何位置 以下是硬编码RuleParts的示例:

Select RuleValue from Rules where Rules.RuleValue like '%A1%' and Rules.RuleValue like '%B1%' and Rules.RuleValue like '%C1%'

通过上面的例子,我的预期结果是A1B1C1或B1A1C1或C1A1B1等。

我该怎么做?

我尝试使用内连接,但它并不匹配每一行中的所有规则部件。

我可以使用动态创建查询来实现此目的,但除非它影响查询性能,否则不希望这样做。

3 个答案:

答案 0 :(得分:4)

一种方法是:

Select r.RuleValue 
  from Rules r
  join Input i
    on r.RuleValue like '%' + i.RulePart + '%'
 group by r.RuleValue 
having count(distinct i.RulePart) = 3     -- or (select count(*) from Input )

<强>更新 更优雅的方法是使用NOT EXISTS来代表ALL

select * 
  from Rules r
 where not exists
     (
       select * 
         from Input i
        where r.RuleValue not like '%'+i.RulePart+'%'
     )

SQL Fiddle Demo

答案 1 :(得分:2)

SELECT * 
FROM Rules a
WHERE RuleValue LIKE '%'+(SELECT stuff((select '%' + cast(c.RulePart as varchar(512))from Input c for xml path('')),1,2,''))+'%'

答案 2 :(得分:0)

这是sqlfiddle link

SELECT * FROM Rules r
INNER JOIN Input n 
ON
substring(r.RuleValue,1,2) = n.RulePart
OR
substring(r.RuleValue,3,2) = n.RulePart
OR
substring(r.RuleValue,5,2) = n.RulePart