powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / SQL можно ли использовать case в where
9 сообщений из 9, страница 1 из 1
SQL можно ли использовать case в where
    #39723167
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток,
Я пишу внутреннюю процедуру (Firebird), и в ней используется 2 входных параметра: ":IN_PROPOSAL_ID" и ":IN_DEPARTMENT_ID_EXECUTE".
Но проблема такая, что в select я хочу использовать 2 типа where (или/или):
- 1-ый вариант: если я передаю " :IN_PROPOSAL_ID" = <значение> , а " :IN_DEPARTMENT_ID_EXECUTE" <= 0 , то выражение должно быть
Код: sql
1.
dp.PROPOSAL_ID = :IN_PROPOSAL_ID


- 2-ой вариант: если я передаю " :IN_PROPOSAL_ID" = <значение> , а " :IN_DEPARTMENT_ID_EXECUTE" > 0 , то выражение должно быть
Код: sql
1.
where dp.PROPOSAL_ID = :IN_PROPOSAL_ID and dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE



У меня вопрос:
Можно ли писать вот так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin
  for
    select d.SORT_WORK_ID, dp.DEVICE_ID, dp.DEPARTMENT_ID_EXECUTE, dp.DEVICES_CL_ID
      from DISTRIBUTION_PROPOSAL dp
        join DEVICES d on d.ID = dp.DEVICE_ID
          where
          (case when :IN_DEPARTMENT_ID_EXECUTE <= 0 then
             dp.PROPOSAL_ID = :IN_PROPOSAL_ID
           else dp.PROPOSAL_ID = :IN_PROPOSAL_ID and dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE
           end)
            into :VAR_SORT_WORK_ID, :VAR_DEVICE_ID, :VAR_DEPARTMENT_ID_EXECUTE, :VAR_DEVICES_CL_ID do
…



дело в том, что процедура компилится, но с ошибкой
«Parsing error»
На строке
Код: sql
1.
dp.PROPOSAL_ID = :IN_PROPOSAL_ID



Заранее спасибо за ответ
...
Рейтинг: 0 / 0
SQL можно ли использовать case в where
    #39723174
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
where dp.PROPOSAL_ID = :IN_PROPOSAL_ID 
  and (dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE OR :IN_DEPARTMENT_ID_EXECUTE <= 0)


PS надеюсь, 2010 - это не год рождения ? ;)
...
Рейтинг: 0 / 0
SQL можно ли использовать case в where
    #39723176
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

CASE в Firebird это выражение возвращающее значение. То что ты хочешь будет работать в 3.0, потому что в нём есть тип BOOLEAN, но лучше так не делать потому что в этом случае про использование индексов можешь забыть.
...
Рейтинг: 0 / 0
SQL можно ли использовать case в where
    #39723312
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

замени case на iif.
...
Рейтинг: 0 / 0
SQL можно ли использовать case в where
    #39723426
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,
А шило замени на мыло. Что изменится?


Kos-2010,
Это без кейса пишется:
Код: sql
1.
2.
3.
where
  :IN_DEPARTMENT_ID_EXECUTE <= 0 and dp.PROPOSAL_ID = :IN_PROPOSAL_ID
  or :IN_DEPARTMENT_ID_EXECUTE > 0 and dp.PROPOSAL_ID = :IN_PROPOSAL_ID and dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE
...
Рейтинг: 0 / 0
SQL можно ли использовать case в where
    #39723781
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

всё равно без индексов будет

если данных много, я бы сделал два SELECT'а на оба случая порознь и например соединил бы их через UNION ALL
...
Рейтинг: 0 / 0
SQL можно ли использовать case в where
    #39723842
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коль это не запрос а процедура - можно вообще сделать 2 отдельных запроса а выполнять каждый или нет - по обычному условию if.
В один набор данных они сами по suspend объединятся, без всяких union all
...
Рейтинг: 0 / 0
SQL можно ли использовать case в where
    #39723917
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Побредить штоле постпятнично тоже
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select d.SORT_WORK_ID, dp.DEVICE_ID, dp.DEPARTMENT_ID_EXECUTE, dp.DEVICES_CL_ID
      from DISTRIBUTION_PROPOSAL dp
        join DEVICES d on d.ID = dp.DEVICE_ID
        where  dp.PROPOSAL_ID = :IN_PROPOSAL_ID
          And dp.DEPARTMENT_ID_EXECUTE=   
           (case when :IN_DEPARTMENT_ID_EXECUTE <= 0 then
              dp.DEPARTMENT_ID_EXECUTE                 
             else dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE
            end)
...
Рейтинг: 0 / 0
SQL можно ли использовать case в where
    #39723918
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаПобредить штоле постпятнично тоже
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select d.SORT_WORK_ID, dp.DEVICE_ID, dp.DEPARTMENT_ID_EXECUTE, dp.DEVICES_CL_ID
      from DISTRIBUTION_PROPOSAL dp
        join DEVICES d on d.ID = dp.DEVICE_ID
        where  dp.PROPOSAL_ID = :IN_PROPOSAL_ID
          And dp.DEPARTMENT_ID_EXECUTE=   
           (case when :IN_DEPARTMENT_ID_EXECUTE <= 0 then
              dp.DEPARTMENT_ID_EXECUTE                 
             else :IN_DEPARTMENT_ID_EXECUTE
            end)


Тьфу. Тяжёлая пятница была, недовырезал. Вот так, конечно.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / SQL можно ли использовать case в where
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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