Выбор строк по нескольким условиям
Задача
Требуется выбрать строки, удовлетворяющие нескольким условиям.
Решение
Используйте предикат 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