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“任何输入”查询?的主要内容,如果未能解决你的问题,请参考以下文章

mysql模糊查询%参数%;当输入%时就奖全部记录都查出来,我想输入%时查询像%aa这样的记录,改怎么办?

mysql 模糊查询

MySQL查询中如何实现弹窗输入变量?

mysql 联合模糊查询问题?

MySQL查询出姓名,姓名长度,系统当地时间

Discord.js mysql查询错误无效输入