【问题标题】:Mysql 8 CASE..WHEN..THEN..END throws syntax errorMysql 8 CASE..WHEN..THEN..END 抛出语法错误
【发布时间】:2021-02-06 04:35:56
【问题描述】:

我有这个查询,它在 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

我的主要问题是为什么会出现语法错误。谷歌,是我的朋友,但不是在这种情况下......我试过了。我还尝试删除“as”,在 case/when/then/end 周围添加括号,但没有任何乐趣!

【问题讨论】:

    标签: mysql-8.0


    【解决方案1】:

    我不确定 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;
    

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多