MySQL 5 到 8 查询迁移(重写)- 表达式中的变量
MySQL 5 to 8 query migration (rewrite) - variables within expressions
我有一个 MySQL 5 查询生成所需的输出,但在 MySQL 8 上有警告。
我对变量的查询:
DROP TABLE IF EXISTS test;
CREATE TABLE test
(
id SERIAL PRIMARY KEY
, percent DECIMAL(5,2) NOT NULL
);
INSERT INTO test (percent) VALUES
(-0.50)
,(0.50)
,(1.00)
,(-0.20)
,(0.50)
,(-1.0)
,(-2.0)
,(0.75)
,(1.0)
,(0.50)
;
SELECT
percent,
CASE @i
WHEN 0 THEN ROUND(@i:=(@i+(percent * 1)),2) -1
ELSE ROUND(@i:=(@i+(percent * ABS(@i))) ,2) -1
END total_percent
FROM
test
, (SELECT @i:=1) vars
ORDER
BY id;
是
的答案之一并产生所需的输出:
+---------+---------------+
| percent | total_percent |
+---------+---------------+
| -0.50 | -0.50 |
| 0.50 | -0.25 |
| 1.00 | 0.50 |
| -0.20 | 0.20 |
| 0.50 | 0.80 |
| -1.00 | -1.00 |
| -2.00 | -3.00 |
| 0.75 | -1.50 |
| 1.00 | -1.00 |
| 0.50 | -0.50 |
+---------+---------------+
10 rows in set, 3 warnings (0.00 sec)
但有 3 个警告:
Warning | 1287 | Setting user variables within expressions is
deprecated and will be removed in a future release. Consider
alternatives: 'SET variable=expression, ...', or 'SELECT expression(s)
INTO variables(s)'.
使用方法:
alternatives: 'SET variable=expression, ...', or 'SELECT
expression(s) INTO variables(s)'.
并更改此查询,使其不会在 MySQL 8?
上生成警告
是否有关于如何正确重写从 MySQL5 到 MySQL8 的查询的一般指南或 recommendations/examples 集,因此 MySQL 上没有警告8?
我预计一般从MySQL 5到MySQL 8个变量不是唯一需要重写的,那还有什么?
请注意问题不是关于使用 CTE,而是重写变量的用法从 MySQL 5 到 MySQL 8 查询,不会产生任何警告或错误。
此外,此问题仅涉及在数据库服务器上生成预期结果,只需一次查询(如果可能)就可以完美解决
备选方案是:
- 使用上一个问题的答案中所示的 CTE。
- 将所有结果提取到您的应用程序中并使用代码逐步计算值,而不是 SQL。
我有一个 MySQL 5 查询生成所需的输出,但在 MySQL 8 上有警告。
我对变量的查询:
DROP TABLE IF EXISTS test;
CREATE TABLE test
(
id SERIAL PRIMARY KEY
, percent DECIMAL(5,2) NOT NULL
);
INSERT INTO test (percent) VALUES
(-0.50)
,(0.50)
,(1.00)
,(-0.20)
,(0.50)
,(-1.0)
,(-2.0)
,(0.75)
,(1.0)
,(0.50)
;
SELECT
percent,
CASE @i
WHEN 0 THEN ROUND(@i:=(@i+(percent * 1)),2) -1
ELSE ROUND(@i:=(@i+(percent * ABS(@i))) ,2) -1
END total_percent
FROM
test
, (SELECT @i:=1) vars
ORDER
BY id;
是
的答案之一并产生所需的输出:
+---------+---------------+
| percent | total_percent |
+---------+---------------+
| -0.50 | -0.50 |
| 0.50 | -0.25 |
| 1.00 | 0.50 |
| -0.20 | 0.20 |
| 0.50 | 0.80 |
| -1.00 | -1.00 |
| -2.00 | -3.00 |
| 0.75 | -1.50 |
| 1.00 | -1.00 |
| 0.50 | -0.50 |
+---------+---------------+
10 rows in set, 3 warnings (0.00 sec)
但有 3 个警告:
Warning | 1287 | Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'.
使用方法:
alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'.
并更改此查询,使其不会在 MySQL 8?
上生成警告是否有关于如何正确重写从 MySQL5 到 MySQL8 的查询的一般指南或 recommendations/examples 集,因此 MySQL 上没有警告8?
我预计一般从MySQL 5到MySQL 8个变量不是唯一需要重写的,那还有什么?
请注意问题不是关于使用 CTE,而是重写变量的用法从 MySQL 5 到 MySQL 8 查询,不会产生任何警告或错误。
此外,此问题仅涉及在数据库服务器上生成预期结果,只需一次查询(如果可能)就可以完美解决
备选方案是:
- 使用上一个问题的答案中所示的 CTE。
- 将所有结果提取到您的应用程序中并使用代码逐步计算值,而不是 SQL。