2011-03-30 104 views
-1
SELECT DISTINCT(EMP.EMPLOYEEID), 
    EMP.EMPLOYEECODE, 
    EMP.EMPLOYEENAME, 
    EMP.HOMEADDRESS, 
    DESIG.DESIGNATIONNAME 
    FROM HRM_EMPLOYEE EMP, 
    COM_DESIGNATION DESIG, 
    COM_DEPARTMENT DEPT, 
    COM_COMPANY COMP, 
    HRM_EMPLOYEEDEPARTMENTS EMPDEPT, 
    USR_USERS USRS 
    WHERE EMP.EMPLOYEEID = EMPDEPT.EMPLOYEEID AND 
    EMP.DESIGNATIONID = DESIG.DESIGNATIONID AND 
    DESIG.DEPARTMENTID = EMPDEPT.DEPARTMENTID AND 
    EMP.STATUS IN (SELECT STAT STAT 
     FROM 
      (
      CASE 
      When (:status = 0) THEN 
      SELECT 1 STAT FROM dual 
      UNION ALL 
      SELECT 2 STAT FROM dual 
      else 
      Select :status STAT from dual 
      end 
     ) 
      xx 
     ) 

其實我的需要是:根據參數傳遞存放記錄。如果tat參數我希望顯示所有記錄。ORA-00907:缺少右括號

+0

那麼,錯誤說你缺少一個右括號,你是。在查詢的末尾添加一個')'。 – Blorgbeard 2011-03-30 07:16:02

+0

請結束您的最後一句話:「如果該參數我希望顯示所有記錄...」。當你想顯示所有記錄時,你的參數的值是多少?我會盡量正確地編寫你當前的查詢。 – 2011-03-30 07:17:47

+0

並且不要忘記標記你的正確答案。 – 2011-03-30 07:50:59

回答

1
SELECT DISTINCT(EMP.EMPLOYEEID), 
    EMP.EMPLOYEECODE, 
    EMP.EMPLOYEENAME, 
    EMP.HOMEADDRESS, 
    DESIG.DESIGNATIONNAME 
    FROM HRM_EMPLOYEE EMP, 
    COM_DESIGNATION DESIG, 
    COM_DEPARTMENT DEPT, 
    COM_COMPANY COMP, 
    HRM_EMPLOYEEDEPARTMENTS EMPDEPT, 
    USR_USERS USRS 
    WHERE EMP.EMPLOYEEID = EMPDEPT.EMPLOYEEID AND 
    EMP.DESIGNATIONID = DESIG.DESIGNATIONID AND 
    DESIG.DEPARTMENTID = EMPDEPT.DEPARTMENTID AND 
    ( 
    (EMP.STATUS IN (1, 2) and :status = 0) 
     or :status <> 0 --This will not filter your status, as I expect you want it to do so 
    ) 
+0

你錯過了'EMP.STATUS =:status'的部分,如Nikhil的查詢所示:'EMP.STATUS IN(選擇:status STAT from dual)' – 2011-03-30 07:23:38

+0

我希望他希望顯示所有記錄,如果狀態<> 0 – 2011-03-30 07:24:31

+0

無論如何,查詢的邏輯是清楚的。 – 2011-03-30 07:25:23

4

你不能有一個CASE聲明爲表表達式(除非也許,如果使用嵌套表類型)。但爲什麼這麼複雜?取而代之的是:

EMP.STATUS IN (SELECT STAT STAT 
    FROM 
     (
     CASE 
     When (:status = 0) THEN 
     SELECT 1 STAT FROM dual 
     UNION ALL 
     SELECT 2 STAT FROM dual 
     else 
     Select :status STAT from dual 
     end 
    ) 
     xx 
    ) 

這樣寫:

(EMP.STATUS IN (1, 2) AND :status = 0) OR 
(EMP.STATUS = :status)