是否有带 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 by
和 having
执行此操作。对于你的情况`:
select name
from @Table
where prop in ('red', 'ball')
group by name
having count(distinct prop) = 2;
我正在编写一些处理对象和标签云的代码,我正在尝试提出一个通用的 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 by
和 having
执行此操作。对于你的情况`:
select name
from @Table
where prop in ('red', 'ball')
group by name
having count(distinct prop) = 2;