Oracle
 sql >> Base de données >  >> RDS >> Oracle

Clause WHERE conditionnelle d'Oracle

Utilisation d'un CASE expression dans WHERE clause devrait faire l'affaire. Lorsque vous dites que vous n'avez pas besoin de la clause where si la condition n'est pas remplie, alors tout ce que vous voulez est une condition comme WHERE 1 = 1 , c'est-à-dire que lorsque la condition n'est pas remplie, renvoie toutes les lignes. Donc, vous devez faire en sorte que la condition non remplie soit toujours TRUE .

Par exemple,

J'ai une table d'employés,

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>

Je souhaite sélectionner les détails de l'employé, si le département est 20, utilisez la clause where, sinon renvoyez tous les détails de l'employé, mais filtrez le département qui remplit la condition where.

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>

Ainsi, pour le département 20, le filtre est appliqué par la clause where, et je n'obtiens que la ligne pour ename SCOTT, pour les autres, il renvoie toutes les lignes.