2017-03-28 107 views
-3
select 
e.EMPNO, 
e.ENAME 
from 
emp e 
where 
e.DEPTNO in (select case 
         when 'D'='D' then q'[10,20]' 
         END DPT 
        from dual) 

編輯:如何構建SQL子查詢?

真正的查詢是一樣的東西

SELECT e.name, e.entid 
    FROM ent e 
WHERE  e.etype = 'DPT' 
     AND e.entid IN (
         SELECT CASE 
           WHEN :P96_GP_TYPE = 'R' THEN q'['QUA','SAMP']' 
           WHEN :P96_GP_TYPE = 'REWR' THEN q'['WASH','FNISH']' END 
         FROM DUAL 
        ) 
+1

問題是什麼? – Aleksej

+0

我需要導致 像 選擇 e.EMPNO, e.ENAME 從 SCOTT.EMPË 其中 e.DEPTNO在(10,20) –

+0

爲什麼不能使用查詢你有嗎?你需要從表中獲得一組可變數據,而不是硬編碼10,20? – Aleksej

回答

0

你並不需要爲這個子查詢,但你可以更好的使用有點布爾邏輯:

SELECT e.name, e.entid 
    FROM ent e 
WHERE  e.etype = 'DPT' 
     AND (
       (:P96_GP_TYPE = 'R' AND e.entid IN ('QUA','SAMP')) 
       OR 
       (:P96_GP_TYPE = 'REWR' AND e.entid IN ('WASH','FNISH')) 
      ) 

要明確您的方法失敗的位置,請考慮這三個查詢是完全等效的:

select * 
from someTable 
where someColumn in ( q'['X','Y']')   

select * 
from someTable 
where someColumn in ( 
        select q'['X','Y']' 
        from dual 
        ) 

select * 
from someTable 
where someColumn in ( 
        select '''X'',''Y''' 
        from dual 
        ) 

如果你想使用子查詢來獲取值的列表,而不是好像值列表文字,你需要的東西,如:

select * 
from someTable 
where someColumn in (
         select 'X' 
         from dual 
         UNION ALL 
         select 'Y' 
         from dual 
        )