【问题标题】:SELECT * WHERE var == [one of many alternatives]SELECT * WHERE var == [众多选择之一]
【发布时间】:2016-12-20 19:43:03
【问题描述】:

在 MySQL 中,我可以使用 OR 指定替代匹配:

SELECT * FROM table WHERE var = 1 OR var = 2

当有很多替代品时,像这样一一列出会变得很麻烦。有没有办法,我可以给出一个列表、向量或值数组?有点像这个伪代码:

SELECT * FROM table WHERE var IN {1, 2, 5, 11, 45}

【问题讨论】:

  • SELECT * FROM table WHERE var IN (1, 2, 5, 11, 45)
  • @Ryan 谢谢!我简直不敢相信我几乎编出了正确的方法:-)
  • 对于投票结束的人:不,这个问题不是由印刷错误引起的。我根据我对数学的理解(大括号代表一个集合)和 R 代码(其中“IN”用于从向量中选择)组成了“解决方案”。它类似于解决方案是一个意外。

标签: mysql sql database where


【解决方案1】:

您可以用括号而不是大括号指定IN

SELECT * FROM table WHERE var IN (1, 2, 5, 11, 45)

【讨论】:

    【解决方案2】:

    第一个MySQL 中的equality/comparison 运算符是=,但不是==

    是的您可以通过引入IN 子句来实现相同的目的。但是您的语法不符合MySQL 标准。应该是:

    SELECT * FROM table WHERE your_column IN (1,2,5,11,45)
    

    注意:

    使用 IN。

    IN 将使用索引。

    OR 将(afaik)不使用索引。

    另外,IN 版本也不容小觑:

    • 使用更少的代码
    • 更容易维护
    • 更容易理解

    仅仅因为这些原因,我就准备受点苦 性能以获得代码质量,但您实际上获得了性能 也是。

    OR VS IN

    【讨论】:

    • 谢谢@1000111,我跳过了FROM table 部分,以便更容易专注于我所询问的部分。
    • 另外你可以看看mysql中OR和IN的性能对比。添加了参考。 @什么
    • 当我在需要高性能的查询中看到OR 时,我有点哭了。这是真的。它们从来都不是好消息,如果你不能消除它们,你就会遇到问题。
    • 您发布的链接已有几年的历史,只是声称 OR 将 (afaik) 不使用索引 并链接到更旧的帖子。 MySQL 以优化器较弱而闻名,但我不希望最新版本与上述示例有任何不同(IN 只是多个ORs 的快捷方式)。找出答案的唯一方法是比较实际计划。
    • @tadman:你可能哭了很多 :-) ORed WHERE 条件是完全有效的(IN 只是隐藏了OR),它们在连接中肯定很糟糕,并且可能当优化器放弃索引访问时会很糟糕。
    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2015-01-26
    • 2014-10-21
    • 2010-12-23
    相关资源
    最近更新 更多