是否有带 AND 逻辑的 SQL WHERE IN 语句?

Is there a SQL WHERE IN statement with AND logic?

我正在编写一些处理对象和标签云的代码,我正在尝试提出一个通用的 SQL 搜索解决方案。

我想让用户能够在与对象关联的标签的 UI 中构建搜索。例如,用户可能会搜索带有标签 'ball' 和 'red' 的所有对象,以找到系统中的所有红球。

下面是一些示例代码:

declare @Table table 
(
    [Name] varchar(50),
    [Prop] varchar(50)
)

insert @Table (name,prop) values ('thing 1','ball')
insert @Table (name,prop) values ('thing 1','red')
insert @Table (name,prop) values ('thing 1','foo') -- tag not part of search

insert @Table (name,prop) values ('thing 2','ball')
insert @Table (name,prop) values ('thing 2','green')

insert @Table (name,prop) values ('thing 3','square')
insert @Table (name,prop) values ('thing 3','red')

insert @Table (name,prop) values ('thing 4','square')
insert @Table (name,prop) values ('thing 4','blue')

select distinct name from @Table
where prop in
(
    'red','ball' -- returns thing 1, thing 2, thing 3
)

现在,精明的编码人员会很快指出这会产生 OR 效果,抓取带有 'Green' 和 'Ball' 标记的对象,这不是我们想要的。

显然我可以将 WHERE 与 AND 一起使用来硬编码值。但是,我希望创建一个 SP,它传入一个 table 变量,其中包含用户想要 AND 在一起的所有标签,而 IN 语法将让我从那个 table 中 select ]参数。

所以,我的问题是:是否有任何 SQL 语法或语句可以与任意数量的值相乘?我什么都不知道,而且我无法通过快速搜索找到任何相关信息。或者,有没有一种方法可以对其进行重组,以便我可以使用任意数量的变量获得和运算结果?

我可以使用生成动态 SQL 脚本的混乱代码来解决这个问题,但我需要性能。这不是真正的 acceptable 解决方案。

我曾尝试使用 De Morgan 定律看看是否可以翻转问题,但由于 SQL 逻辑的执行方式而失败。

select distinct name from @Table
where name not in
(
    select name from @Table
    where prop not in
    (
     'red','ball'
    )
)

这失败了,因为它查找了 ANDed 标签,但忽略了与标签不完全匹配的任何结果。 (事物 1 有一个 'foo' 的切线 属性,这阻止了它被包含。本质上它正在寻找匹配 'red' 和 'ball',但没有其他属性的对象,这是行不通的)

那么,有什么建议吗?这是一个棘手的问题...

您使用 group byhaving 执行此操作。对于你的情况`:

select name
from @Table
where prop in ('red', 'ball')
group by name
having count(distinct prop) = 2;