Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Case в Where


Автор: m9yt 9.8.2016, 15:59
Привет всем.
Пытаюсь написать запрос, который бы в зависимости от параметра производил фильтрацию строк по определенному условию.
Т.е. хотел бы получить что-то типа такого:
Код

SELECT *
  FROM m_user m
 WHERE m.KEY IN CASE
                   WHEN :usr = -1
                   THEN
                      m.KEY                      -- вернуть всех пользователей
                   WHEN :usr = 0
                   THEN
                      (SELECT t.KEY
                         FROM my_table t
                        WHERE t.sex = 1) -- отфильтровать людей по полу. Но вот тут как раз возвращается несколько строк, что выдает ошибку
                   ELSE
                      :usr                 -- вернуть конкретного пользователя
                END

Как можно иначе написать запрос, чтобы была поддержка фильтрации в зависимости от параметра?

Автор: Akina 9.8.2016, 16:22
UPD. Написал ответ, но был невнимателен. Удалил, переписываю.

Суть:
Код

SELECT *
FROM m_user m
WHERE m.KEY IN
(
SELECT 
-- Вот тут все твои условия и раскручивай
CASE :usr
WHEN -1 THEN m.KEY
WHEN 0 THEN CASE t.sex WHEN 1 THEN t.KEY ELSE 0 END
ELSE :usr
END
FROM my_table t
)

Но это только суть, на самом деле надо всё то же, но без WHERE IN, а на основе m LEFT JOIN t.

Рекомендация: три отдельных запроса, а хоть бы и в рамках одной ХП.

Автор: LSD 9.8.2016, 19:21
Код

select * from table where :usr = -1 and ...
union
select * from table where :usr = 0 and ...
union
select * from table where :usr not in (-1, 0) and ...

Автор: Zloxa 11.8.2016, 20:50
Цитата(LSD @  9.8.2016,  20:21 Найти цитируемый пост)
union

union all

Добавлено @ 20:57
ну и суть то же, но  без замудрствований
Код

wehre 
  :usr = -1 
  or :usr = 0 and t.sex = 1
  or t.key not in (0, -1) and t.key = :usr


Автор: LSD 15.8.2016, 14:24
Цитата(Zloxa @  11.8.2016,  21:50 Найти цитируемый пост)
union all

А зачем? Там же взаимоисключающие условия?

Автор: Akina 15.8.2016, 14:25
Цитата(LSD @  15.8.2016,  15:24 Найти цитируемый пост)
А зачем? Там же взаимоисключающие условия? 

А чтобы исключить операцию сортировки в тщетной попытке найти и отсеять дубликаты.

Автор: Zloxa 15.8.2016, 20:53
Цитата(LSD @  15.8.2016,  15:24 Найти цитируемый пост)
А зачем?

union и union all суть разные операции. Нелепо явно указывать одну операцию, полагая, что неявно вместо нее всегда будет выполняться другая. smile

Цитата(LSD @  15.8.2016,  15:24 Найти цитируемый пост)
Там же взаимоисключающие условия? 

Даже если отработает лишь один запрос из объединяемых, к нему все равно будет применен distinct

Цитата(Akina @  15.8.2016,  15:25 Найти цитируемый пост)
А чтобы исключить операцию сортировки в тщетной попытке найти и отсеять дубликаты. 

С огромной долей вероятности, ненужной сотртировки тут не будет. Выбирается по звездочке, в таблице наверняка есть PK. Конечно, для пущей надёги, можно бы еще и rowid в select list вписать, чтоб вместо указанного union железобетонно выполнялся union all  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)