2016-12-29 22 views
0

私は自分のステートメントに動的列を作成しました。私の動的な列で、私はさまざまなCASEステートメントを使用しています。今、WHERE句で動的列をフィルタリングできません。動的列のDB2 SQL WHERE句

SELECT 
    item1, 
    item2, 
    CASE WHEN item1 = '1' THEN '10' END AS item3 FROM "Table1" 
WHERE item3 = '10'; 

上記のステートメントは、動的な列にフィルタを使用するとエラーになります。

答えて

0

まず、あなたは

SELECT 
    item1, 
    item2, 
    CASE WHEN item = '1' THEN '10' END AS item3 
FROM TABLE 

第二に、テーブルを参照する必要がwhere句がselect前に実行されますので、item3item3にはない、whereの実行を取得する場合を意味し、元の列ではありません存在する。

You could do this way: 

SELECT * FROM (
SELECT 
    item1, 
    item2, 
    CASE WHEN item = '1' THEN '10' END AS item3, 
FROM TABLE) as A 
WHERE A.item3 = '10' 
0

派生テーブルでクエリをラップ:

select item1, item2, item3 
from 
(
    SELECT 
     item1, 
     item2, 
     CASE WHEN item = '1' THEN '10' END AS item3 
    FROM tablename 
) dt 
WHERE item3 = '10'; 
1

Where句は、論理的にそうあなたがWhere句でSelectで生成Alias名前を使用することはできませんSelect前に処理されるため、エラーがあります。

はまた、不要なカンマがありテーブル名

した後、あなたはWhere句で直接

SELECT item1, 
     item2, 
     CASE WHEN item = '1' THEN '10' END AS item3 
FROM "Table1" --, unwanted comma 
WHERE CASE WHEN item = '1' THEN '10' END = '10' 

CASEを使用することができますが、CASEネストされた/コンプレックスを持っている場合、私はおそらく、他の2つの答えとなりますステートメント

+0

オススメです。訂正していただきありがとうございます。 –

0
//with cte 
with tmp as (
SELECT 
item1, 
item2, 
CASE WHEN item = '1' THEN '10' END AS item3 
FROM "Table1" 
) 
select * from tmp where item3='10' 

//with subselect 
select * from (
SELECT 
item1, 
item2, 
CASE WHEN item = '1' THEN '10' END AS item3 
FROM "Table1" 
) tmp where item3='10' 

//with reuse case 
SELECT 
    item1, 
    item2, 
    CASE WHEN item = '1' THEN '10' END AS item3 
FROM tablename where CASE WHEN item = '1' THEN '10' END ='10'