mysql - 在mysql中的case语句中设置变量

标签 mysql sql database

我有以下场景

SELECT
...
...
(
   @var1 = MAX(IF(table1.name='Mod', table1.value, NULL))
   @var2 = MAX(IF(table1.name='Man', table1.value, NULL))
     CASE
        WHEN @var1 IS NOT NULL && @var2 IS NOT NULL THEN @var1+"/"+@var2
        WHEN @var1 IS NULL && @var2 IS NOT NULL THEN @var2
        WHEN @var1 IS NOT NULL && @var2 IS NULL THEN @var1
        ELSE NULL
END) AS "col44",

这在 mysql 控制台中引发了异常。

我们不能在一般的 mysql select 查询中进行变量赋值吗?

最佳答案

这个怎么样?

SELECT ...
   , @var1 = MAX(IF(table1.name='Mod', table1.value, NULL))
   , @var2 = MAX(IF(table1.name='Man', table1.value, NULL))
   , CASE
        WHEN @var1 IS NOT NULL && @var2 IS NOT NULL THEN @var1+"/"+@var2
        WHEN @var1 IS NULL && @var2 IS NOT NULL THEN @var2
        WHEN @var1 IS NOT NULL && @var2 IS NULL THEN @var1
        ELSE NULL
     END AS "col44"

请注意添加逗号并删除括号。


或者,您可以只使用子查询。 (根据我的经验,当与聚合结合使用时,查询中的变量可能变得不可预测;这完全避免了变量)。

   SELECT ...
         , CASE
            WHEN modMax IS NOT NULL && manMax IS NOT NULL THEN modMax+"/"+manMax
            WHEN modMax IS NULL && manMax IS NOT NULL THEN manMax
            WHEN modMax IS NOT NULL && manMax IS NULL THEN modMax
            ELSE NULL
         END AS "col44"
    FROM (
        SELECT ...
           , MAX(IF(table1.name='Mod', table1.value, NULL)) AS modMax
           , MAX(IF(table1.name='Man', table1.value, NULL)) AS manMax
        ...
      ) AS subQ

附加说明:注意modMax+"/"+manMax;它最终可能会给你一个由 modMax+0+manMax 计算得出的整数,而不是字符串。

关于mysql - 在mysql中的case语句中设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46837290/

相关文章:

mysql - 如何在不更改数据的情况下更改表编码?

PHP MySQL 使用变量进行查询

python - Django - 如何在将文本保存到数据库之前修改文本?

mysql - MySQL 查询 View 的速度问题

mysql - 在shell脚本中将字符串转换为xml?

mysql - 将两个表合二为一以提高搜索速度?

mysql - 为特定的人选择最多 "popular"关注者。某人拥有的追随者越多,他们的 "popular"就越多

SQL - 按列获取组的计数,但也选择组的顶部项目

Java Jackcess 按多个列查找行

mysql - 当表有键值对时如何在sql查询中使用IN