2016-06-21 10 views
0
select x+y as z, 
case 
    when "x"+"y" < 0 then "Less Than Zero" 
    when "x"+"y" > 0 then "Non Zero" 
    else "Zero" 
end 
from sometable; 

期待される結果を返しますが、加算はデータの各行で複数回実行されます。一般的な部分式を最適化する方法は?

私は..

select x+y as z, 
case 
    when "z" < 0 then "Less Than Zero" 
    when "z" > 0 then "Non Zero" 
    else "Zero" 
end 
from sometable; 

は常に「ゼロより小さい」を返し、次のようにクエリを最適化しようとしているが、働いていません。

このクエリで何が間違っていますか?クエリの実行中にABを複数回追加することを避けるにはどうすればよいですか?

答えて

0

SELECT句の列エイリアスは、同じSELECT句の他の式では使用できません。 (?何SELECT x AS y, y AS x ...で起こるべき)

あなたは、サブクエリにそれを移動することで、このようなエイリアスを利用可能にすることができます

SELECT z, 
     CASE WHEN z < 0 THEN 'Less Than Zero' 
      WHEN z > 0 THEN 'Non Zero' 
      ELSE   'Zero' 
     END 
FROM (SELECT x + y AS z 
     FROM sometable); 

しかし、これが唯一の入力を保存します。実際には重複計算を最適化するわけではありません。

 
sqlite> explain select z, z from (select x+y as z from sometable); 
addr opcode   p1 p2 p3 p4    p5 comment 
---- ------------- ---- ---- ---- ------------- -- ------------- 
0  Init   0  11 0     00 Start at 11 
1  OpenRead  1  2  0  2    00 root=2 iDb=0; sometable 
2  Rewind   1  9  0     00 
3  Column   1  0  3     00 r[3]=sometable.x 
4  Column   1  1  4     00 r[4]=sometable.y 
5  Add   4  3  1     00 r[1]=r[4]+r[3] 
6  Add   4  3  2     00 r[2]=r[4]+r[3] 
7  ResultRow  1  2  0     00 output=r[1..2] 
8  Next   1  3  0     01 
9  Close   1  0  0     00 
10 Halt   0  0  0     00 
11 Transaction 0  0  1  0    01 usesStmtJournal=0 
12 TableLock  0  2  0  sometable  00 iDb=0 root=2 write=0 
13 Goto   0  1  0     00 
関連する問題