我希望在 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 语句,那就不行了。 理想的解决方案是:
- 仅运行一次输入(如果它们是 select 语句)。
- 可以轻松扩展任意数量的输入。
- 与输入类型无关(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/