Oracle Conditional where clause

↘锁芯ラ 提交于 2019-12-22 11:23:00

问题


is there any way to write query with following functionality, add where clause as a conditional way,

      select e.emp_id, emp.admin_user from employees e

if emp.admin != 'Y'

then

query run with where clause

else

query run without where clause ?


回答1:


Using a CASE expression in the WHERE clause should do the trick. When you say you don't need the where clause if condition is not met, then all you want is a condition like WHERE 1 = 1, i.e. when condition is not met then return all rows. So, you need to make the not met condition as always TRUE.

For example,

I have an employee table,

SQL> SELECT empno, ename, deptno
  2  FROM emp;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7369 SMITH              20
      7499 ALLEN              30
      7521 WARD               30
      7566 JONES              20
      7654 MARTIN             30
      7698 BLAKE              30
      7782 CLARK              10
      7788 SCOTT              20
      7839 KING               10
      7844 TURNER             30
      7876 ADAMS              20
      7900 JAMES              30
      7902 FORD               20
      7934 MILLER             10

14 rows selected.

SQL>

I want to select the employee details, if department is 20 then use the where clause else return all the employee details, but filter the department which meets the where condition.

SQL> SELECT empno, ename, deptno
  2  FROM emp
  3  WHERE ename =
  4    CASE
  5      WHEN deptno = 20
  6      THEN 'SCOTT'
  7      ELSE ename
  8    END
  9  /

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7499 ALLEN              30
      7521 WARD               30
      7654 MARTIN             30
      7698 BLAKE              30
      7782 CLARK              10
      7788 SCOTT              20
      7839 KING               10
      7844 TURNER             30
      7900 JAMES              30
      7934 MILLER             10

10 rows selected.

SQL>

So, for department 20, the filter is applied by where clause, and I get only the row for ename SCOTT, for others it returns all the rows.




回答2:


To keep it simple I would go for union clause in this case, so you can have your where clause as complex as you need. I tried to guess your table structure from above comment, let's see this example:

SQL> create table employees (emp_id number, admin_user number, project_id number);

Table created.

SQL> create table project_accessible_to_user (emp_id number, project_id number);

Table created.

Now make simple union all of two queries one with where condition anoother without it

SQL> select * from employees e where e.admin_user!='Y' and project_id in

(select project_id from project_accessible_to_user where emp_id=e.emp_id)    

 union all 

select * from employees e where (e.admin_user is null or   
 e.admin_user='Y');

UNION ALL is better from performance point of view as UNION because it means that it is not checking for intersect values so if there are any it will return duplicates. However in this case it is filtered already by condition on admin_user, so these duplicates will not occure.



来源:https://stackoverflow.com/questions/29027425/oracle-conditional-where-clause

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!