我有以下查询:
SELECT
m1.ID,
(CASE WHEN <condition> THEN
<expr1.1>
ELSE
<expr1.2>
END) as [Tag1],
(CASE WHEN <condition> THEN
<expr2.1>
ELSE
<expr2.2>
END) as [Tag2],
(CASE WHEN <condition> THEN
<expr3.1>
ELSE
<expr3.2>
END) as [Tag3],
FROM MyTable AS m1
LEFT OUTER JOIN MyOtherTable m2
ON m2.ID = m1.ID
正如您所看到的,我有三次相同的条件,但每个分支中的表达式不同。在SQL中是否可以只写一次条件并让它在这种情况下发出三元组?或者是否可以通过其他任何方式防止多次写入相同的条件?
我想在Sqlite3中使用它。
答案 0 :(得分:1)
可悲的是(afaik)SQLite没有公用表表达式,但您可以在子查询中计算表达式并使用CASE代替。
它不会消除任何case表达式,但它可以简化每个表达式中的表达式,只需要在一个地方进行更改;
例如,查询;
SELECT CASE WHEN sel=1 OR sel=3 AND a<>2 OR sel=2 AND a<>3 OR sel=4 THEN a ELSE b END e,
CASE WHEN sel=1 OR sel=3 AND a<>2 OR sel=2 AND a<>3 OR sel=4 THEN b ELSE c END f,
CASE WHEN sel=1 OR sel=3 AND a<>2 OR sel=2 AND a<>3 OR sel=4 THEN c ELSE a END g
FROM olle;
......可以改写为......
SELECT CASE WHEN exp THEN a ELSE b END e,
CASE WHEN exp THEN b ELSE c END f,
CASE WHEN exp THEN c ELSE a END g
FROM (SELECT *, sel=1 OR sel=3 AND a<>2 OR sel=2 AND a<>3 OR sel=4 exp FROM olle);
这个例子可能看起来不是很简单,但对于复杂的表达式或经常更改的表达式,它可能会产生很大的不同。
答案 1 :(得分:0)
基本上就是这样。
您可以在CASE
表中使用JOIN
语句,这样您就可以使用CASE
语句,但除非您的数据已经过某种方式构建这使得这可能不值得。