我希望在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语句,则不会。 理想的解决方案是:
答案 0 :(得分: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