我有一张这样的表
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等。
我该怎么做?
我尝试使用内连接,但它并不匹配每一行中的所有规则部件。
我可以使用动态创建查询来实现此目的,但除非它影响查询性能,否则不希望这样做。
答案 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+'%'
)
答案 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)
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