Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2018, 21:45   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию SQL – можно ли использовать «case» в «where»

Доброе время суток,
Я пишу внутреннюю процедуру (Firebird)

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

Код:
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 is null 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»
На строке
dp.PROPOSAL_ID = :IN_PROPOSAL_ID

Заранее спасибо за ответ
KBO вне форума Ответить с цитированием
Старый 25.10.2018, 22:10   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Нет же логического типа данных а огнептице, а в твоем case такая попытка. Почему не
Код:
where dp.PROPOSAL_ID = :IN_PROPOSAL_ID and (:IN_DEPARTMENT_ID_EXECUTE is null or dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.10.2018, 22:57   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Нет же логического типа данных а огнептице, а в твоем case такая попытка. Почему не
Код:
where dp.PROPOSAL_ID = :IN_PROPOSAL_ID and (:IN_DEPARTMENT_ID_EXECUTE is null or dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE)
Мне кажется не корректно будет работать (или я ошибаюсь)

ведь в процедуру я хочу передавать:
- или один параметр :IN_PROPOSAL_ID (where dp.PROPOSAL_ID = :IN_PROPOSAL_ID)
- или сразу два параметра :IN_PROPOSAL_ID и :IN_DEPARTMENT_ID_EXECUTE (where dp.PROPOSAL_ID = :IN_PROPOSAL_ID and dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE)

т.е. должны работать 2 вырианта where
или (где IN_DEPARTMENT_ID_EXECUTE = null)
Код:
where dp.PROPOSAL_ID = :IN_PROPOSAL_ID
или (где IN_DEPARTMENT_ID_EXECUTE не должен = null)
Код:
where dp.PROPOSAL_ID = :IN_PROPOSAL_ID and dp.DEPARTMENT_ID_EXECUTE = :IN_DEPARTMENT_ID_EXECUTE

Последний раз редактировалось KBO; 25.10.2018 в 23:08.
KBO вне форума Ответить с цитированием
Старый 25.10.2018, 23:38   #4
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Извиняюсь не правильно выразился.

в select я хочу использовать 2 типа where (или/или):

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

Последний раз редактировалось KBO; 25.10.2018 в 23:51.
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Когда вместо минфина можно прописать пару case и один default MihalNik Свободное общение 12 29.07.2022 12:46
SQL Access Case Dvoishnik SQL, базы данных 6 15.01.2016 15:34
T-SQL Выражение CASE xxbesoxx SQL, базы данных 24 24.06.2015 12:40
Можно в case задать больше одной команды? sunny_alice Паскаль, Turbo Pascal, PascalABC.NET 2 14.05.2011 22:06
Как использовать функцию Case maloun Общие вопросы Delphi 11 08.02.2011 19:19