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

标签 mysql case mysql-error-1241

我希望在 mysql 中使用 case 表达式,并以两列作为输入。这就是我想要格式化代码的方式。所有代码片段都使用 Set @a = 0;在开始时设置@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 会抛出错误代码:1241。操作数应包含 1 列。 作为引用,以下两项都有效,这让我很好奇为什么上面的不起作用。

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') 是要检查的有效大小写)。

最佳答案

您不能将简短版本的 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

关于具有两个输入列的 MySql CASE 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39396522/

相关文章:

mysql - 冗余表之间的 JOIN

php - 视频不流mysql php

mysql计算每个用户的书数并在每一行中显示

mysql - MYSQL 中的查询表。 mysql select语句中的IF语句,如果字段为空,则左连接以获取替换值

php - PDO 数据库访问 WHERE title = $title

mysql - 从mysql中的一行中的特定列中查找最后一个非空值的列名

sql - 缺少关键字 (ORA-00905) - Oracle SQL Case 语句

mysql - 操作数应包含 1 列 - MySQL NOT IN

mysql - 复制行错误消息 "Operand should contain 1 column(s)"

mysql - 操作数应包含 1 列 数据库错误