powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Case в Where
12 сообщений из 12, страница 1 из 1
Case в Where
    #39289052
Volik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.
Пытаюсь написать запрос, который бы в зависимости от параметра производил фильтрацию строк по определенному условию.
Т.е. хотел бы получить что-то типа такого:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select *
  from m_user m
where m.key in case
                       when :usr = -1 then m.key -- вернуть всех пользователей
                       when :usr = 0 then (select m2.key
                                                     from m_user m2
                                                   where m2.sex = 1) -- отфильтровать людей по полу. Но вот тут как раз возвращается несколько строк, что выдает ошибку
                      else :usr -- вернуть конкретного пользователя
                   end


Как можно иначе написать запрос, чтобы была поддержка фильтрации в зависимости от параметра?
...
Рейтинг: 0 / 0
Case в Where
    #39289055
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UNION ALL ?
...
Рейтинг: 0 / 0
Case в Where
    #39289059
svpk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
select *
  from m_user m
where (:usr = -1) or (:usr = 0 and m.sex = 1) or (m.key = :usr)
...
Рейтинг: 0 / 0
Case в Where
    #39289074
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут оно красиво выглядит, но плохо с точки зрения производительности -- OR по умолчанию (без хинта) не раскладывает план на несколько веток
Т.е. что-то искать через индекс, что-то фулсканом, а тут вообще соединение с другой таблицей (со своими тараканами)
...
Рейтинг: 0 / 0
Case в Where
    #39289075
Volik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svpk,
немного неточно написал запрос. таблица m_user m2 - не та, что нужна. должна быть другая таблица. Назовем m_table, для примера. В ней хранятся нужные ключи.
...
Рейтинг: 0 / 0
Case в Where
    #39289076
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volik,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select *
from m_user
where case 
    when :usr = -1 then 1
    when :usr = 0 and sex = 1 then 1
    when :usr = 1 and <условие_для_конкретного_пользователя> then 1 
else 0 end = 1

?
...
Рейтинг: 0 / 0
Case в Where
    #39289080
Volik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mRdUKE,
выше подкорректировал условие
...
Рейтинг: 0 / 0
Case в Where
    #39289092
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров, а разве в данном примере оракл не будет отбрасывать две из веток по несоответствию первого условия?
:usr ведь не будет одновременно всем трем удовлетворять.
...
Рейтинг: 0 / 0
Case в Where
    #39289100
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это легко увидеть в плане
...
Рейтинг: 0 / 0
Case в Where
    #39289164
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volik,

а если так попробовать?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select *
  from m_user m,
       (select m2.key
                                                     from m_table m2
                                                   where m2.sex = 1) mm
where m.key in (case
                       when :usr = -1 then m.key -- вернуть всех пользователей
                       when :usr = 0 then mm.key -- отфильтровать людей по полу. Но вот тут как раз возвращается несколько строк, что выдает ошибку
                      else :usr -- вернуть конкретного пользователя
                   end) and m.key = mm.key(+)
...
Рейтинг: 0 / 0
Case в Where
    #39289181
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K790,

не, фигня какая-то :)
...
Рейтинг: 0 / 0
Case в Where
    #39289473
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volik,

через гланды
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SQL> select *
  2    from emp e
  3  where e.deptno in
  4  (select d.deptno from dept d where
  5                 (case when :usr = -1                            then 1
  6                      when :usr = 0 and e.job='CLERK'            then 1
  7                      when :usr not in (0,-1) and :usr =d.deptno then 1
  8                      else 0
  9                     end) = 1)
 10  /

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7934 MILLER     CLERK           7782 23.01.82       1300                    10
      7369 SMITH      CLERK           7902 17.12.80        800                    20
      7876 ADAMS      CLERK           7788 12.01.83       1100                    20
      7900 JAMES      CLERK           7698 03.12.81        950                    30

SQL> exec :usr:=10;

PL/SQL procedure successfully completed.

SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7782 CLARK      MANAGER         7839 09.06.81       2450                    10
      7839 KING       PRESIDENT            17.11.81       5000                    10
      7934 MILLER     CLERK           7782 23.01.82       1300                    10

SQL>



......
stax]
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Case в Where
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]