在大量条件下使用SQL的CASE?

时间:2017-08-09 10:10:54

标签: mysql sql

我想做的是:

case_1  case_2  case_3  Final
0           0    0      0
0           0    1      3
0           1    0      2
1           0    0      1
1           1    0      2
1           0    1      3
0           1    1      3
1           1    1      3

这意味着当case_1为0,case_2为0且case_3为0时,最终col为0。     类似地,当case_1为1时,case_2为1且case_3为1,则最终cols为3。     等等。

最后我输入的SQL结果很尴尬:

Select *,
case when case_1>0 and case_2>0 and case_3>0 then 3 else 0,
case when case_1>0 and case_2>0 and case_3=0 then 2 else 0,  
case when case_1>0 and case_2=0 and case_3=0 then 1 else 0,
....
....
....
from mytable;

现在这非常糟糕,我知道。可以有更好的编码方式吗?

3 个答案:

答案 0 :(得分:2)

从示例中,看起来优先级是案例3 - >案例2 - >案例1.在这种情况下,您可以执行以下操作:

{{1}}

答案 1 :(得分:1)

看起来你想要非零列的最右边位置(如果有的话)

 select *,
    case when case_3>0 then 3 else 
      case when case_2>0 then 2 else
       case when case_1>0 then 1 else 0 end
      end
    end final
 from tbl

答案 2 :(得分:1)

对于它的价值,电气工程知道这个问题为"从真值表生成布尔表达式。"

我与其他回答者的方向不同。

创建一个包含8行和4列的小型查找表,如下所示

SELECT * FROM final

| case_1 | case_2 | case_3 | Final |
|--------|--------|--------|-------|
|      0 |      0 |      0 |     0 |
|      0 |      0 |      1 |     3 |
|      0 |      1 |      0 |     2 |
|      1 |      0 |      0 |     1 |
|      1 |      1 |      0 |     2 |
|      1 |      0 |      1 |     3 |
|      0 |      1 |      1 |     3 |
|      1 |      1 |      1 |     3 |

然后加入到您的主数据表中,查找final值,如下所示(http://sqlfiddle.com/#!9/4de009/1/0)。

  SELECT a.Name, b.Final
    FROM test a
    JOIN final b ON a.case_1 = b.case_1 
                AND a.case_2 = b.case_2
                AND a.case_3 = b.case_3

性能?在八行查找表上没有问题。 SQL是为此而创建的。

灵活性?如果您的计算Final的规则发生了变化,那么您需要更新表格。您不必再次进行布尔表达式简化。

复杂?嗯,是的,它比一堆嵌套的CASE或IF语句更复杂。但它更容易阅读。