Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle Bedingte where-Klausel

Verwenden eines CASE Ausdruck im WHERE Klausel sollte den Trick tun. Wenn Sie sagen, Sie brauchen die where-Klausel nicht, wenn die Bedingung nicht erfüllt ist, dann brauchen Sie nur eine Bedingung wie WHERE 1 = 1 , d. h. wenn die Bedingung nicht erfüllt ist, werden alle Zeilen zurückgegeben. Also müssen Sie die nicht erfüllte Bedingung wie immer WAHR machen .

Zum Beispiel

Ich habe eine Mitarbeitertabelle,

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>

Ich möchte die Mitarbeiterdetails auswählen, wenn die Abteilung 20 ist, dann verwenden Sie die Where-Klausel, sonst geben Sie alle Mitarbeiterdetails zurück, aber filtern Sie die Abteilung, die die Where-Bedingung erfüllt.

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>

Für Abteilung 20 wird der Filter also durch die where-Klausel angewendet, und ich erhalte nur die Zeile für ename SCOTT, für andere werden alle Zeilen zurückgegeben.