Цель: выбрать записи из таблицы заказов, где (delivery_date, type) НЕ ВХОДИТ (NULL, 'A').
select * from Orders;
Table : Orders
No Type Delivery_Date
1 A null
2 B 20150120
3 A 20150115
4 A 20150115
5 A 20150111
6 A 20150112
7 B null
8 B null
Ожидаемый результат :
No Type Delivery_Date
2 B 20150120
3 A 20150115
4 A 20150115
5 A 20150111
6 A 20150112
7 B null
8 B null
Пробовал следующие ограничения в предложении where, но безуспешно.
1. WHERE (DELIVERY_DATE, TYPE) IS NOT IN (NULL, 'A')
2. WHERE (NVL(DELIVERY_DATE, 0), TYPE) IS NOT IN (0, 'A')
Чтобы заставить его работать, добавьте столбец с именем required_row, для которого установлено значение Y, если это условие равно (delivery_date - null и type = 'A'), и выберите только те записи, где required_row равно Y.
with orders
as
(select 1 as no, 'A' as type, null as delivery_date from dual union
select 2 as no, 'B' as type, 20150120 as delivery_date from dual union
select 3 as no, 'A' as type, 20150115 as delivery_date from dual union
select 4 as no, 'A' as type, 20150115 as delivery_date from dual union
select 5 as no, 'A' as type, 20150111 as delivery_date from dual union
select 6 as no, 'A' as type, 20150112 as delivery_date from dual union
select 7 as no, 'B' as type, null as delivery_date from dual union
select 8 as no, 'B' as type, null as delivery_date from dual
)
select * from ( select orders.*,
case when orders.delivery_date is null and type = 'A'
then 'N' else 'Y'
end as required_row from orders) where required_row='Y';
Приветствуются любые предложения / мысли о достижении того же самого при любом другом подходе с учетом производительности.