mysql CASE中计算值〈0时如何赋值0

nzkunb0c  于 2023-01-01  发布在  Mysql
关注(0)|答案(2)|浏览(144)

我有一个名为users的MySQL表,其中包含所有用户的简单计数。
| 用户标识|计数器1|计数器2|
| - ------| - ------| - ------|
| 1个|无|五个|
| 第二章|1个|六个|
| 三个|第二章|七|
| 四个|三个|八个|
我想运行一个查询,将counter1的值更新为counter1-#或0(#可以是任何整数),取较大值,以用于可能的多个用户。
我正在执行以下查询以更新用户2和3:

UPDATE 
   users 
SET 
   counter1 =   CASE user_id 
                WHEN 2 THEN GREATEST(counter1 - 2, 0) 
                WHEN 3 THEN GREATEST(counter1 - 5, 0) 
                ELSE counter1 END
WHERE user_id IN(2, 3);

运行上述查询将返回错误:

    • BIGINT UNSIGNED值超出"("用户"."计数器1 "-2)"的范围**

我试图达到的最终结果是用户2和用户3在执行查询后都具有最小的counter1值0,因为在这两个用户的情况下,从他们的counter1值中减去2/5将是负数,这当然不起作用。
有没有办法用一个查询来完成这个任务?

axr492tv

axr492tv1#

问题是当counter1小于2时,表达式counter1 - 2会产生一个负值。但由于它声明为UNSIGNED,使用它的表达式的结果也是无符号的,因此不允许负值。
使用IF()表达式来防止计算这些无效值,而不是从中减去。

CASE user_id
    WHEN 2 THEN IF(counter1 > 2, counter1 - 2, 0)
    WHEN 3 THEN IF(counter1 > 5, counter1 - 5, 0)
    ELSE counter1
END
h7appiyu

h7appiyu2#

最简单的方法是:

GREATEST(0, CASE ... END)

相关问题