Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

Can't we do a variable assignment in the general mysql select query?

like image 270
user2133404 Avatar asked May 28 '26 14:05

user2133404


1 Answers

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; it may end up giving you an integer calculated from modMax+0+manMax, instead of a string.

like image 178
Uueerdo Avatar answered May 31 '26 06:05

Uueerdo