Mysql 8 CASE..WHEN..THEN..END 抛出语法错误
Mysql 8 CASE..WHEN..THEN..END throws syntax error
我有这个查询,它在 Mysql 5.* 中没有问题,但我最近升级到 MySQL 8,现在查询抛出如下语法错误:
您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 'row_number, @breed'
附近使用的正确语法
查询是(为简单起见删除了许多无用的细节):
SELECT `name`, `age`, breed
FROM (
SELECT
`dogs`.`name`,
`dogs`.`age`,
@row_number:=CASE WHEN @breed=breed
THEN @row_number+1
ELSE 1
END AS row_number
, @breed:=breed AS breed
FROM `dogs` /* other details with joins, subqueries and limits left out for simplicity*/;
breed
应该维护一个行数,这样我就可以得到按 breed
分组的行的 n 行。也就是说,如果 n=2,例如,我的结果将是:
name | age | breed
------------------
fifi | 2 | labrador
bingo | 5 | labrador
rocket | 1 | german shepherd
sky | 1 german shepherd
我的主要问题是为什么会出现语法错误。 Google, 是我的朋友,但在这种情况下不是......我试过了。我也尝试删除“as”,在 case/when/then/end 周围添加括号,但没有快乐!
我不确定 MySQL 8 是否以与 MySQL 5.x 相同的方式支持用户变量。无论如何,您当前的语法至少已被弃用,您应该只使用 ROW_NUMBER
分析函数。例如,假设您想要每个品种的两只最小的动物,您可以尝试:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY breed ORDER BY age) rn
FROM dogs
-- maybe joins here
)
SELECT name, age, breed
FROM cte
WHERE rn <= 2;
我有这个查询,它在 Mysql 5.* 中没有问题,但我最近升级到 MySQL 8,现在查询抛出如下语法错误:
您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 'row_number, @breed'
附近使用的正确语法查询是(为简单起见删除了许多无用的细节):
SELECT `name`, `age`, breed
FROM (
SELECT
`dogs`.`name`,
`dogs`.`age`,
@row_number:=CASE WHEN @breed=breed
THEN @row_number+1
ELSE 1
END AS row_number
, @breed:=breed AS breed
FROM `dogs` /* other details with joins, subqueries and limits left out for simplicity*/;
breed
应该维护一个行数,这样我就可以得到按 breed
分组的行的 n 行。也就是说,如果 n=2,例如,我的结果将是:
name | age | breed
------------------
fifi | 2 | labrador
bingo | 5 | labrador
rocket | 1 | german shepherd
sky | 1 german shepherd
我的主要问题是为什么会出现语法错误。 Google, 是我的朋友,但在这种情况下不是......我试过了。我也尝试删除“as”,在 case/when/then/end 周围添加括号,但没有快乐!
我不确定 MySQL 8 是否以与 MySQL 5.x 相同的方式支持用户变量。无论如何,您当前的语法至少已被弃用,您应该只使用 ROW_NUMBER
分析函数。例如,假设您想要每个品种的两只最小的动物,您可以尝试:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY breed ORDER BY age) rn
FROM dogs
-- maybe joins here
)
SELECT name, age, breed
FROM cte
WHERE rn <= 2;