在 SQL 中使用多个 OR [关闭]

Posted

技术标签:

【中文标题】在 SQL 中使用多个 OR [关闭]【英文标题】:Using multiple OR in SQL [closed] 【发布时间】: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。 【参考方案1】:

    你可以使用

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

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

    您也可以使用:

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

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

    您还可以使用 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。

【讨论】:

以上是关于在 SQL 中使用多个 OR [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

多个级别的 SQL Datediff [关闭]

从 SQL 表获取的数组中的单个 IF 语句与多个 IF 语句 [关闭]

尝试将数据插入多个表时出错 [C# Winform SQL Server] [关闭]

更新多个 WHERE SQL 不起作用 [关闭]

符合多个数据库的在线 SQL 语法检查器 [关闭]

SQL Alchemy - 从一个实体上的多个一对一关系中删除孤儿[关闭]