我想做的是:
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;
现在这非常糟糕,我知道。可以有更好的编码方式吗?
答案 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语句更复杂。但它更容易阅读。