我希望在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语句,只运行一次。
- 可以很容易地扩展任何数量的输入。
- 与输入类型无关(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