【问题标题】:Using multiple OR in SQL [closed]在 SQL 中使用多个 OR [关闭]
【发布时间】:2014-07-15 07:05:14
【问题描述】:

我需要编写一个查询来检查表中是否至少有一列的值大于 0 (>0)。目前,我已经编写了一个带有多个 OR 条件的“WHERE”子句。我怀疑这可能不是最好的方法(可能是使用 SUM?)。征求 SQL 专家的意见。

WHERE raw_0 >0 OR raw_1 >0 OR raw_2 >0 OR raw_3 >0 OR raw_4>0

【问题讨论】:

  • 原始列的内容会不会是负数?
  • 您现有的查询是最容易编写和理解的(并且可能对优化器来说是最好的,因为不涉及计算)
  • @schlonzo 值不能为负数。它们为 0 或大于 0。

标签: mysql sql performance


【解决方案1】:
  1. 你可以使用

    WHERE (raw_0 >0 OR raw_1 >0 OR raw_2 >0 OR raw_3 >0 OR raw_4>0); 
    

    根据您的问题。正如 dnoeth 所评论的那样,它是最容易编写和理解的(并且对于优化器来说可能是最好的,因为不涉及计算)

  2. 您也可以使用:

    WHERE ((RAW_0 + RAW_1 + RAW_2 + RAW_3) > 0);
    

    如果且仅当至少一个值>0时满足上述条件。

  3. 您还可以使用 concat 运算符来连接字符串并检查连接的字符串是否具有非零值:

    WHERE TO_NUMBER ( RAW_0 || RAW_1 || RAW_2 || RAW_3 ) > 0
    

    第三次查询的测试数据:

    select 'YES value' data from dual where TO_NUMBER ( 1 || 2) > 0 ;
    select 'NO value' data from dual where TO_NUMBER ( 0 || 0) > 0 ;
    

【讨论】:

  • 这只有在原始列中的值不能为负数时才有效。
  • @schlonzo:用户已指定该值在他的 cmets 中不是负数。
  • 是的,你是对的。他在你回答后发布了这个。但对其他人来说可能是件好事。
  • 是的,当然@schlonzo ..也感谢您的突出和支持。
【解决方案2】:

如果值只能是非负数,如 OP 注释之一,那么您可以检查乘法

WHERE raw_0 * raw_1 * raw_2 * raw_3 * raw_4 > 0

但这将检查每个值是否为正。要检查是否只有一个是肯定的,我们可以使用 SIGN 函数来否定这个逻辑

WHERE (1 - SIGN(raw_0)) 
    * (1 - SIGN(raw_1)) 
    * (1 - SIGN(raw_2)) 
    * (1 - SIGN(raw_3)) 
    * (1 - SIGN(raw_4)) = 0

(1 - SIGN(value))当值为0时返回1,当值为正时返回0,因此如果至少一个值为正,则乘积为0。

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2020-09-22
    • 2014-08-09
    • 2020-10-05
    • 2016-04-25
    相关资源
    最近更新 更多