MYSQL将每行中列的值减去

时间:2019-02-15 07:44:30

标签: mysql

我想使用MySQL查询减去一列中的每一行。我在这里在MSSQL https://social.msdn.microsoft.com/Forums/sqlserver/en-US/180b705c-08d9-467a-b247-814a8bb85a4a/how-can-can-i-subtract-the-value-of-the-column-in-each-row-?forum=transactsql上找到了解决方案,我在MSSQL上进行了尝试,并且运行良好。但是,我尝试在MySQL上使用它并更改lil位查询,但它不起作用。这是我的查询

set @UpdatedQTY = 850;
UPDATE testsa
SET m1010=CASE WHEN @UpdatedQTY < 0 THEN 0 ELSE @UpdatedQTY END,
    @UpdatedQTY =  m1010-ABS(@UpdatedQTY)
WHERE m1010-ABS(@UpdatedQTY) < 0

这是响应

  

1064-您的SQL语法有错误;查看与您的MariaDB服务器版本相对应的手册以获取在'UPDATE testsa附近使用的正确语法   组   m1010 =第2行@UpdatedQTY <0则0 ELSE @UpdatedQTY END'时的情况

任何人都可以在MySQL上使用它,或者MySQL不支持该查询吗?

1 个答案:

答案 0 :(得分:1)

您发布的代码包含两个查询:set @UpdatedQTY = 850UPDATE testsa ...

或者将它们分开并一一运行,或者,如果使用的工具或库允许运行多个查询,则必须使用;来分隔它们。

要使UPDATE语句更易于阅读,可以使用GREATEST()函数代替CASE operator

UPDATE testsa
SET m1010 = GREATEST(0, @UpdatedQTY),
   @UpdatedQTY = m1010 - ABS(@UpdatedQTY)
WHERE m1010 - ABS(@UpdatedQTY) < 0

要使其更具可读性(可能更快),您可以预先计算ABS(@UpdatedQTY)并将其存储到另一个变量中:

# This is probably set dynamically
SET @UpdatedQTY = 850;

# Compute its absolute value
SET @AbsQTY = ABS(@UpdatedQTY);

# Update the table
UPDATE testsa
SET m1010 = GREATEST(0, @UpdatedQTY),
   @UpdatedQTY = m1010 - @AbsQTY
WHERE m1010 < @AbsQTY