有两个输入列的MySql CASE表达式



我希望在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是选择语句,它就不可行了。理想的解决方案是:

  1. 如果输入是select语句,只运行一次。
  2. 可以很容易地扩展任何数量的输入。
  3. 与输入类型无关(IE (@a,@b) = (0,'!@#$:abc')是要检查的有效案例)。

不能使用多个值的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

相关内容

  • 没有找到相关文章