MySQL“任何输入”查询?
Posted
技术标签:
【中文标题】MySQL“任何输入”查询?【英文标题】:MySQL "ANY IN" query? 【发布时间】:2019-02-06 19:39:01 【问题描述】:有没有什么捷径可以在 mysql 中做这样的事情:
WHERE s.loc1 IN ("A", "B", "C", "D")
OR s.loc2 IN ("A", "B", "C", "D")
OR s.loc3 IN ("A", "B", "C", "D");
不重复 ("A", "B", "C", "D") 位(并且最好以这种方式仍然可以通过@param 提供此列表)?可悲的是,(s.loc1, s.loc2, s.loc3) IN (blah) 的语法似乎只适用于 AND 而不是 OR。
理想的解决方案如下所示:
WHERE (s.loc1, s.loc2, s.loc3) ANY IN ("A", "B", "C", "D");
【问题讨论】:
OR's 应该可以工作...你能提供最小完整和可验证的示例 (MVCE),它显示 OR's 不工作并指出这是什么版本的 mySQL?只是一个带有 loc1、2、3 和示例数据的示例创建表,也许您需要使用撇号而不是引号? 简短回答:没有语法可以将您的三个“in/or”子句合并为一个单一的、shoter 子句。 可以将 IN 表添加到 from 并比较等于 tho! 哦,我现在明白了.... 消除重复的 in。好吧,你可以,但我认为维护更清洁你的方式,因为它很容易看到你想要什么。SELECT Distinct s.* FROM SO52121085 s CROSS JOIN (SELECT "A" x UNION ALL SELECT "B" x UNION ALL SELECT "C" x UNION ALL SELECT "D" x) Val WHERE s.loc1 = x or s.loc2 = x or S.LOC3 = x;
DEMO 现在如果 A、B、C、D 在表中,我们可以消除联合并简单地选择位置。
“像这样”是什么意思?涉及不重复表达的事情?
【参考方案1】:
您可以从值联合生成的表(即表子查询或derived table)中进行查询:
select
*
from (
(select loc1 as loc, s.* from s)
union
(select loc2 as loc, s.* from s)
union
(select loc3 as loc, s.* from s)
) t
where
t.loc in ("A","B","C","D");
运行上述查询产生:
+-----+------+------+------+
| loc | loc1 | loc2 | loc3 |
+-----+------+------+------+
| A | A | 2 | 3 |
| D | D | 2 | 3 |
| B | 1 | B | 3 |
| C | 1 | 2 | C |
+-----+------+------+------+
当在这个组成的数据上运行时:
drop table if exists s;
create table s (
loc1 varchar(255) not null,
loc2 varchar(255) not null,
loc3 varchar(255) not null
);
insert into s values
("1","2","3"),
("A","2","3"),
("1","B","3"),
("1","2","C"),
("D","2","3");
另见demo version
【讨论】:
以上是关于MySQL“任何输入”查询?的主要内容,如果未能解决你的问题,请参考以下文章