Выбор строк по нескольким условиям

Задача

Требуется выбрать строки, удовлетворяющие нескольким условиям.

Решение

Используйте предикат WHERE в сочетании с операторами OR и AND. Например, по следующему запросу будут выбран все служащие 10-го отдела, а также служащие, получающие комиссионные, и служащие 20 отдела, зарабатывающие не более $2000:

select e.*
from emp e
where 1=1
and e.deptno = 10
or e.comm is not null
or e.sal <= 2000 and e.deptno = 20;


EMPNO ENAME      JOB        MGR HIREDATE  SAL COMM DEPTNO
----- ---------- ---------- --- --------- --- ---- ------
 7369 SMITH      CLERK      7902 17-DEC-80 800          20
 7499 ALLEN      SALESMAN   7698 20-FEB-81 1600  300     30
 7521 WARD       SALESMAN   7698 22-FEB-81 1250  500     30
 7654 MARTIN     SALESMAN   7698 28-SEP-81 1250 1400     30
 7782 CLARK      MANAGER    7839 09-JUN-81 2450          10
 7839 KING       PRESIDENT      17-NOV-81 5000          10
 7844 TURNER     SALESMAN   7698 08-SEP-81 1500    0     30
 7876 ADAMS      CLERK      7788 12-JAN-83 1100          20
 7934 MILLER     CLERK      7782 23-JAN-82 1300          10

 9 rows selected

Конструкция 1=1 и перенос кода на новую строку с добавлением and используется для того, чтобы быстро можно было закомментировать следующий за этим выражением критерий выборки, и таким образом, чтобы он не учавствовал в запросе.

Обсуждение

Чтобы выбрать строки, отвечающие нескольким условиям, используются операторы AND, OR в сочетании с круглыми скобками. В приведенном в “Решении” примере предикат WHERE фильтрует строки, для которых:

  • DEPTNO равен 10 или
  • COMM не NULL или
  • зарплата любого служащего, для которого DEPTNO равен 20, составляет не более $2000.


Условия, заключенные в круглые скобки, должны выполняться одновременно.


Например, посмотрим, как изменится результирующее множество, если использовать в запросе круглые скобки, как показано ниже:

select e.*
from emp e
where 1=1
and (
 e.deptno = 10
 or e.comm is not null
 or e.sal <= 2000
)
and e.deptno = 20;


EMPNO ENAME      JOB        MGR HIREDATE  SAL COMM DEPTNO
----- ---------- ---------- --- --------- --- ---- ------
 7369 SMITH      CLERK      7902 17-DEC-80 800          20
 7876 ADAMS      CLERK      7788 12-JAN-83 1100          20