MySql CASE表达式,带有两个输入列

时间:2016-09-08 16:57:02

标签: mysql case mysql-error-1241

我希望在mysql中使用case表达式,并将两列作为输入。这就是我想格式化代码的方式。所有代码段在开头都使用Set @a = 0; Set @b = 0;,但可以修改这些值。我自己的用例有几个值(每个超过2个)。

SELECT 
    CASE (@a , @b)
        WHEN (0 , 0) THEN 'Both zero'
        WHEN (1 , 0) THEN 'a is 1'
        WHEN (0 , 1) THEN 'b is 1'
        WHEN (1 , 1) THEN 'both 1'
        ELSE NULL
    END;

以这种方式使用case语句时,MySql抛出Error Code: 1241. Operand should contain 1 column(s)。 作为参考,以下两项工作,让我好奇为什么上面没有。

SELECT 
    IF((@a , @b) = (0 , 0),
        'Both zero',
        IF((@a , @b) = (1 , 0),
            'a is 1',
            IF((@a , @b) = (0 , 1),
                'b is 1',
                IF((@a , @b) = (1 , 1), 'both 1', NULL))));

SELECT 
    CASE
        WHEN (@a , @b) = (0 , 0) THEN 'Both zero'
        WHEN (@a , @b) = (1 , 0) THEN 'a is 1'
        WHEN (@a , @b) = (0 , 1) THEN 'b is 1'
        WHEN (@a , @b) = (1 , 1) THEN 'both 1'
        ELSE NULL
    END;

所以,问题是: 在进行多列比较时,我可以像使用第一个代码段一样使用CASE表达式吗? 如果是,请提供一个例子。如果没有,为什么不呢?

对于我自己的用例,第三种方法是完全可行的,但如果@a和@b是select语句,则不会。 理想的解决方案是:

  1. 只运行输入一次,如果它们是select语句。
  2. 可以轻松扩展任意数量的输入。
  3. 对输入类型不可知(IE(@ a,@ b)=(0,'!@#$:abc')是一个有效的案例来检查)。

1 个答案:

答案 0 :(得分:0)

您不能将CASE的短版本用于多个值。您需要使用使用AND

测试这两个条件的长版本
CASE 
    WHEN @a = 0 AND @b = 0 THEN 'Both zero'
    WHEN @a = 1 AND @b = 0 THEN 'a is 1'
    WHEN @a = 0 AND @b = 1 THEN 'b is 1'
    WHEN @a = 1 AND @b = 1 THEN 'Both 1'
    ELSE NULL
END

另一种选择是将它们连接起来。

CASE CONCAT(@a, @b)
    WHEN '00' THEN 'Both zero'
    WHEN '10' THEN 'a is 1'
    WHEN '01' THEN 'b is 1'
    WHWN '11' THEN 'Both 1'
    ELSE NULL
END