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.