首页 > 解决方案 > 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 服务器版本相对应的手册,以在第 2 行的“UPDATE testa SET m1010=CASE WHEN @UpdatedQTY < 0 THEN 0 ELSE @UpdatedQTY END”附近使用正确的语法

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

标签: mysql

解决方案


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

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

为了使UPDATE语句更易于阅读,您可以使用GREATEST()函数而不是CASE运算符

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

推荐阅读