Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Case в Where / 12 сообщений из 12, страница 1 из 1
09.08.2016, 15:55:06
    #39289052
Volik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
Привет всем.
Пытаюсь написать запрос, который бы в зависимости от параметра производил фильтрацию строк по определенному условию.
Т.е. хотел бы получить что-то типа такого:
Код: 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
09.08.2016, 15:58:15
    #39289055
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
UNION ALL ?
...
Рейтинг: 0 / 0
09.08.2016, 16:01:37
    #39289059
svpk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
Код: 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
09.08.2016, 16:08:53
    #39289074
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
Тут оно красиво выглядит, но плохо с точки зрения производительности -- OR по умолчанию (без хинта) не раскладывает план на несколько веток
Т.е. что-то искать через индекс, что-то фулсканом, а тут вообще соединение с другой таблицей (со своими тараканами)
...
Рейтинг: 0 / 0
09.08.2016, 16:09:03
    #39289075
Volik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
svpk,
немного неточно написал запрос. таблица m_user m2 - не та, что нужна. должна быть другая таблица. Назовем m_table, для примера. В ней хранятся нужные ключи.
...
Рейтинг: 0 / 0
09.08.2016, 16:09:03
    #39289076
mRdUKE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
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
09.08.2016, 16:09:57
    #39289080
Volik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
mRdUKE,
выше подкорректировал условие
...
Рейтинг: 0 / 0
09.08.2016, 16:15:46
    #39289092
Бельфя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
Вячеслав Любомудров, а разве в данном примере оракл не будет отбрасывать две из веток по несоответствию первого условия?
:usr ведь не будет одновременно всем трем удовлетворять.
...
Рейтинг: 0 / 0
09.08.2016, 16:20:11
    #39289100
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
А это легко увидеть в плане
...
Рейтинг: 0 / 0
09.08.2016, 17:25:49
    #39289164
K790
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
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
09.08.2016, 17:36:54
    #39289181
K790
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
K790,

не, фигня какая-то :)
...
Рейтинг: 0 / 0
10.08.2016, 10:38:11
    #39289473
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в Where
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Case в Where / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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