0

我希望在 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. 如果输入是选择语句,则只运行一次。
  2. 可以轻松扩展任意数量的输入。
  3. 与输入类型无关(IE (@a,@b) = (0,'!@#$:abc') 是要检查的有效案例)。
4

1 回答 1

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
于 2016-09-08T17:10:26.483 回答