2011-03-30 100 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)