使CASE-WHEN子句发出元组

时间:2014-02-21 16:33:25

标签: sql sqlite

我有以下查询:

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中使用它。

2 个答案:

答案 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);

这个例子可能看起来不是很简单,但对于复杂的表达式或经常更改的表达式,它可能会产生很大的不同。

An SQLfiddle to test with

答案 1 :(得分:0)

基本上就是这样。

您可以在CASE表中使用JOIN语句,这样您就可以使用CASE语句,但除非您的数据已经过某种方式构建这使得这可能不值得。

相关问题