Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Cláusula onde condicional do Oracle


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.