SQL 0如果为负值

Bra*_*ram 15 mysql sql mysql-workbench

所以我想将负值变为0.我找到了两个完全相同的解决方案:

SUM(IF(ordered_item.amount < 0, 0, ordered_item.amount)) as purchases
Run Code Online (Sandbox Code Playgroud)

SUM(CASE WHEN ordered_item.amount < 0 THEN 0 ELSE ordered_item.amount END) as purchases
Run Code Online (Sandbox Code Playgroud)

他们给我两个相同的结果,但哪个会给我最好的表现呢?是否可能有一个更简单的解决方案来消极0.

Cod*_*bie 34

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

SUM(GREATEST(ordered_item.amount, 0)) as purchases
Run Code Online (Sandbox Code Playgroud)

  • 我最喜欢这个解决方案.任何时候你都可以在更少的SQL行中完成相同的任务是一件好事,IMO.更好的是它具有与OP的建议相同的性能:http://sqlfiddle.com/#!9/90f21/3 (2认同)
  • 如果有类似的 T-SQL 就更好了 (2认同)

Vol*_*kut 5

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

CREATE TABLE ordered_item ( 
order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
amount INT UNSIGNED NOT NULL, 
PRIMARY KEY (`order_id `) 
); 
Run Code Online (Sandbox Code Playgroud)

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


Vit*_*kis 5

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

(绝对值(x)+x)/2

尝试使用 5 和 -5 分别给出 5 和 0。不确定它是否计算密集,但很容易写:

Select (ABS(ordered_item.amount) + ordered_item.amount ) / 2 as purchases
from ordered_item
Run Code Online (Sandbox Code Playgroud)

如果你用你的数据集尝试一下,请告诉我速度,我得到了类似的速度。