简体   繁体   English

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

[英]Set a variable inside case statement in mysql

I have the following scenario 我有以下情况

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",

This is throwing me an exception in the mysql console. 这在mysql控制台中引发了异常。

Can't we do a variable assignment in the general mysql select query? 我们不能在一般的mysql select查询中进行变量赋值吗?

What about this? 那这个呢?

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"

Note the addition of commas, and removal of parenthesis. 请注意添加逗号,并删除括号。


Alternatively, you could just use a subquery. 或者,您可以只使用子查询。 (In my experience, variables in queries can become unpredictable when used in conjunction with aggregation; this avoids the variables altogether). (以我的经验,查询的变量与聚合一起使用时可能变得不可预测;这完全避免了变量)。

   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

Additional note: Watch out for modMax+"/"+manMax ; 附加说明:注意modMax+"/"+manMax ; it may end up giving you an integer calculated from modMax+0+manMax, instead of a string. 最终可能会给您一个从modMax + 0 + manMax计算得出的整数,而不是字符串。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM