Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Case в предложение where / 8 сообщений из 8, страница 1 из 1
26.12.2016, 13:35
    #39375256
NaumOff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в предложение where
Перешел на 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
26.12.2016, 13:42
    #39375266
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в предложение where
NaumOff
Код: sql
1.
Select * from table where iif(:str = 1, fld1 > 0, fld1 < 0) end


Что это делает?
...
Рейтинг: 0 / 0
26.12.2016, 13:44
    #39375270
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в предложение where
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
26.12.2016, 13:53
    #39375282
NaumOff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case в предложение where
Есть кусок кода в PL SQL, в котором меняется переменная или много переменных. Я хочу вместо кучи текста(по старинке, используя IF THEN) написать один запрос, который зависел бы от состояния этих переменных по сложному условию.

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

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

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

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


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