Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Case в Where 
:(
    Опции темы
m9yt
Дата 9.8.2016, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



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

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

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

Это сообщение отредактировал(а) m9yt - 9.8.2016, 16:13
PM MAIL   Вверх
Akina
Дата 9.8.2016, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 453



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.

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
LSD
Дата 9.8.2016, 19:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 18
Всего: 537



Код

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 ...



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Zloxa
Дата 11.8.2016, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3470
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(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



Это сообщение отредактировал(а) Zloxa - 11.8.2016, 20:59


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
LSD
Дата 15.8.2016, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 18
Всего: 537



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Akina
Дата 15.8.2016, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 453



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 15.8.2016, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3470
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(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 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.