我有一个在大表上运行的查询,因此我需要使其尽可能优化运行,并希望清理此特定方程式。
SET points = IF(
(20 - ABS(pick.guessed_rank - team.rank)) < 0,
0,
(20 - ABS(pick.guessed_rank - team.rank))
)
我该如何改善以将
ABS(pick.guess_rank - team.rank)
保存到变量,以便更新看起来像这样:@diff = ABS(pick.guess_rank - team.rank;
SET points = IF(@diff < 0, 0, @diff);
或许有比使用if语句更好的解决方案,但是在这种情况下如何使用变量的示例仍然会有所帮助。
最佳答案
您想要GREATEST
函数在逻辑上做同样的事情:
SET @points = GREATEST(20 - ABS(pick.guessed_rank - team.rank), 0);
或更具体地
SET @diff = 20 - ABS(pick.guessed_rank - team.rank);
SET @points = GREATEST(@diff,0);
并获得额外的奖励积分
SET @min_margin=20;
SET @diff = ABS(pick.guessed_rank - team.rank);
SET @points_diff = GREATEST(@diff,@min_margin);
-编辑-
在直接SQL CLI中,我必须对每个变量使用
@
。我相信stored procedure
有区别关于mysql - MySQL如何在更新中使用局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46411091/