Använda ett CASE uttryck i WHERE klausul borde göra susen. När du säger att du inte behöver where-satsen om villkoret inte är uppfyllt, är allt du vill ha ett villkor som WHERE 1 = 1
, d.v.s. när villkoret inte är uppfyllt, returnera alla rader. Så du måste göra villkoret inte uppfyllt som alltid TRUE .
Till exempel,
Jag har ett arbetsbord,
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>
Jag vill välja personalinformation, om avdelningen är 20, använd where-klausulen annars returnerar all personalinformation, men filtrera avdelningen som uppfyller where-villkoret.
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>
Så för avdelning 20 tillämpas filtret av where-satsen, och jag får bara raden för ename SCOTT, för andra returnerar det alla rader.