【问题标题】:SQL 0 if negative valueSQL 0 如果为负值
【发布时间】:2015-07-10 04:35:11
【问题描述】:

所以我想将负值变成 0。我找到了 2 个完全相同的解决方案:

SUM(IF(ordered_item.amount < 0, 0, ordered_item.amount)) as purchases

还有

SUM(CASE WHEN ordered_item.amount < 0 THEN 0 ELSE ordered_item.amount END) as purchases

他们给了我相同的结果,但哪一个会给我最好的性能?是否有一个更简单的解决方案可以将否定变成0

【问题讨论】:

  • 为什么不只是MAX(ordered_item.amount, 0)
  • 您可以使用EXPLAIN {{QUERY}} 来检查哪个查询更复杂
  • 在大多数 RDBMS 中,查询计划器很可能会为类似的事情生成相同的执行计划。像@Germanaz0 建议的那样,在每个查询上使用EXPLAIN
  • OP,根据@Germanaz0 的解释,我对您的两个建议以及小提琴上的一个建议答案进行了解释:sqlfiddle.com/#!9/90f21/3 这三个都是相同的,所以选择一个你找到最易读且可能在未来最容易维护的。
  • @McAdam331 是的,我不确定我们所说的 SQL 的风格,我假设是 TSQL,但看起来它是 mySQL。概念上相同。

标签: mysql sql mysql-workbench


【解决方案1】:

还没有看到这个答案,那么如何实现数学逻辑:

(abs(x)+x)/2

尝试使用 5 和 -5 分别得到 5 和 0。 不知道是不是计算密集,但写起来很容易:

Select (ABS(ordered_item.amount) + ordered_item.amount ) / 2 as purchases
from ordered_item

如果你想用你的数据集尝试它,请告诉我速度,我得到的速度相似。

【讨论】:

    【解决方案2】:

    您可以使用的另一种方法是GREATEST() 函数。

    SUM(GREATEST(ordered_item.amount, 0)) as purchases
    

    【讨论】:

    • 这似乎是最简单的解决方案!谢谢
    • 我最喜欢这个解决方案。任何时候你可以用更少的 SQL 行完成相同的任务是一件好事,IMO。更好的是它与 OP 的建议具有相同的性能:sqlfiddle.com/#!9/90f21/3
    • 如果有等效的 T-SQL 就好了
    • SUM 有必要吗?
    • @DropDropped 确实如此。 OP 想要一种方法来汇总 amount 列中的所有正值,同时忽略负值。
    【解决方案3】:

    您可以将字段定义为“无符号”,因此不需要转换

    CREATE TABLE ordered_item ( 
    order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    amount INT UNSIGNED NOT NULL, 
    PRIMARY KEY (`order_id `) 
    ); 
    

    https://dev.mysql.com/doc/refman/5.0/en/integer-types.html

    【讨论】:

    • 我不允许更改表格,但答案很好!我会牢记这一点,以备将来之用。谢谢
    • 这个解决方案在技术上是不正确的,因为 OP 想要一个将负值变成 0 的解决方案。如果要将负值插入到表中,这个解决方案将返回一个 INT UNSIGNED 错误:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多