2016-12-29 114 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 

其次,item3不是原始列,因为where条款得到select之前执行,当where得到执行,这意味着,该item3不存在。

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

的错误是因为之前Select,所以你不能使用Where子句中Select产生的AliasWhere子句逻辑处理。

也有一个无用逗号表名后

可以使用CASE直接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声明

+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'