powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Case в предложение where
8 сообщений из 8, страница 1 из 1
Case в предложение where
    #39375256
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перешел на FB3. Очень не хватало Boolean типа. Теперь можно строить красивые выражения в where, но
вот так не работает
Код: sql
1.
Select * from table where case when (:str=1) then fld1 > 0 when (:str=2) then fld1 < 0 end


ругается на то, что находится после then.
Приходится извращаться таким образом
Код: sql
1.
Select * from table where case when (:str=1) then iif(fld1 > 0, True, False) end


ну или так, если условие достаточно простое
Код: sql
1.
Select * from table where iif(:str = 1, fld1 > 0, fld1 < 0) end



Такое чувство, что немного не допилили использование case в where.
Это ожидаемое поведение птицы?
...
Рейтинг: 0 / 0
Case в предложение where
    #39375266
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOff
Код: sql
1.
Select * from table where iif(:str = 1, fld1 > 0, fld1 < 0) end


Что это делает?
...
Рейтинг: 0 / 0
Case в предложение where
    #39375270
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOff,
ты пытаешься применить CASE к конструированию условий. Он для этого не предназначен.
Он предназначен для вычисления значений.

SQL Language Extension: CASE
Function:
Allow the result of a column to be determined by a the results of a
case expression.
...
Рейтинг: 0 / 0
Case в предложение where
    #39375282
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть кусок кода в PL SQL, в котором меняется переменная или много переменных. Я хочу вместо кучи текста(по старинке, используя IF THEN) написать один запрос, который зависел бы от состояния этих переменных по сложному условию.

o_v_a,
Совершенно верно, хочу конструировать условия. IIF и Decode работают ведь. Разницы с Case я не вижу, это упрощенные его версии.
Теперь можно непосредственно оперировать с Boolean, так если Case возвращает его, почему бы его результат напрямую не использовать в поисковом условии?
...
Рейтинг: 0 / 0
Case в предложение where
    #39375285
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOff,

Код: sql
1.
2.
3.
4.
5.
6.
Select * from rdb$database
where
  case
    when (:str=1) then RDB$RELATION_ID > 0
    when (:str=2) then RDB$RELATION_ID < 0
  end



у меня работает. Однако хотел бы отметить что такие решения кривые, поскольку индекс по fld1 уже не задействовать
...
Рейтинг: 0 / 0
Case в предложение where
    #39375286
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOff,

ах ты в PSQL (не PL SQL у нас не Оракл)

Ну тогда скорее всего это парсер IBExpert ругается
...
Рейтинг: 0 / 0
Case в предложение where
    #39375291
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaumOffЯ хочу вместо кучи текста(по старинке, используя IF THEN) написать один запрос, который зависел бы от состояния этих переменных по сложному условию.
Хочется кривые планы и неожиданные тормоза?
Лучше уж тогда через union all делать.
...
Рейтинг: 0 / 0
Case в предложение where
    #39375298
NaumOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

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


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