Usando um CASE expressão em ONDE cláusula deve fazer o truque. Quando você diz que não precisa da cláusula where se a condição não for atendida, tudo o que você quer é uma condição como
WHERE 1 = 1
, ou seja, quando a condição não for atendida, retorne todas as linhas. Portanto, você precisa definir a condição não atendida como sempre VERDADEIRO . Por exemplo,
Eu tenho uma mesa de funcionários,
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>
Eu quero selecionar os detalhes do funcionário, se o departamento for 20, use a cláusula where, caso contrário, retorne todos os detalhes do funcionário, mas filtre o departamento que atende à condição 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>
Então, para o departamento 20, o filtro é aplicado pela cláusula where, e recebo apenas a linha para ename SCOTT, para outros ele retorna todas as linhas.