Имя: Пароль:
1C
 
SQL: Не работает оператор CASE в условии (СУБД Firebird 2.5)
,
0 zsergey
 
07.10.14
12:16
Все привет! Давненько я сюда не захаживал! :) Господа, почему у меня не работает этот запрос в Firebird?

    SELECT
        sale.name,
        sale.FACTPRICE,
        sale.FACTSUMMA
    FROM
        table1 AS Sale
    WHERE
        sale.datetime between ? and ?

        and
            CASE when sale.code=19 then
                sale.FACTSUMMA>100
            else
                sale.FACTSUMMA>1000
            end


    ORDER by
        sale.code, sale.datetime

Ругается на выражение sale.FACTSUMMA>100. Аналогичный запрос успешно отрабатывает 1С. Может в огнептице такое нельзя делать?
1 MMF
 
07.10.14
12:22
and sale.FACTSUMMA > iff(sale.code=19, 100, 1000)
2 Ёпрст
 
07.10.14
12:29
а так ?

sale.FACTSUMMA>(case when sale.code=19 then 100 else 1000 end)
3 zsergey
 
07.10.14
12:41
(1,2) Оба вариантса работают, спасибо!. Идем теперь далее: мне нужно сделать динамическое условие

SELECT
        sale.name,
        sale.FACTPRICE,
        sale.FACTSUMMA
    FROM
        table1 AS Sale
    WHERE
        sale.datetime between ? and ?

        and sale.code in (1,3,4)
      
но когда sale.code=4 тогда sale.FACTSUMMA>100
иначе все значения из "FACTSUMMA"

я пробовал так - не работает:

SELECT
        sale.name,
        sale.FACTPRICE,
        sale.FACTSUMMA
    FROM
        table1 AS Sale
    WHERE
        sale.datetime between ? and ?
        and sale.code in (1,3,4)
        and
          case
            when sale.code=4 then
             sale.FACTSUMMA>100
          end

    ORDER by
        sale.code, sale.datetime
4 Ёпрст
 
07.10.14
12:46
and  sale.FACTSUMMA>( case when sale.code=4 then 100 else 0 end)
5 zsergey
 
07.10.14
12:55
о, спасибо!

И последний вопрос:

SELECT
        sale.name,
        sale.FACTPRICE,
        sale.FACTSUMMA
    FROM
        table1 AS Sale
    WHERE
        sale.datetime between ? and ?
        and sale.code in (1,3,4)
        and
          case
            when sale.code=4 then
             sale.FACTSUMMA=100 //!
          end

    ORDER by
        sale.code, sale.datetime

здесь так и охота написать:
and  sale.FACTSUMMA=(case when sale.code=4 then 100 else not null end) :))
6 Ёпрст
 
07.10.14
13:06
че за нот нулл у числа ?
7 Ёпрст
 
07.10.14
13:06
по русски, как условие выглядеть должно  ?
8 trad
 
07.10.14
13:08
(7) если код=4, то фактсум надо проверить на равенство 100, иначе фактсцмм надо проверить на нотнул
так как то
9 Ёпрст
 
07.10.14
13:20
(8) да ладно ?
:))
10 Ёпрст
 
07.10.14
13:21
как оно нот нулл будет в этом запросе? :)
11 zsergey
 
07.10.14
13:26
про not null это я образно.
Условие такое: если код=4, то "FACTSUMMA" надо проверить на равенство 100, иначе любое число.
12 MMF
 
07.10.14
13:27
(7) страшно подумать, что автор пишет в 1с при таком построении условий. "Аналогичный запрос успешно отрабатывает 1С", ага, щас
13 MMF
 
07.10.14
13:28
(11) иначе любое число проверить на равенство 100? хых
14 zsergey
 
07.10.14
13:31
(12)

ВЫБРАТЬ
    ПеремещениеТоваровТовары.Ссылка,
    ПеремещениеТоваровТовары.Ссылка.ВидОперации
    
ИЗ
    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ГДЕ
    ПеремещениеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ВЫБОР
        КОГДА                   ПеремещениеТоваровТовары.Ссылка.Проведен
                ТОГДА ПеремещениеТоваровТовары.Ссылка.ВидОперации = &ВидОперации
            ИНАЧЕ ПеремещениеТоваровТовары.Ссылка.ВидОперации = &ВидОперации1
        КОНЕЦ

в 1С это работает! Что-то подобное в Firebird нет!
15 zsergey
 
07.10.14
13:37
(13) Если Код=4 тогда выбрать записи с ""FACTSUMMA"=100, при прочих кодах, выбрать всё (без условия с "FACTSUMMA"). Так понятно?
16 zsergey
 
07.10.14
13:41
т.е. так вот не прокатит:

SELECT
        sale.name,
        sale.FACTPRICE,
        sale.FACTSUMMA
    FROM
        table1 AS Sale
    WHERE
        sale.datetime between ? and ?

       and sale.code in (1,3,4)
       and case
             when sale.code=4 then
               sale.FACTSUMMA=100
           end
17 trad
 
07.10.14
13:43
(15)
where Код!=4 or FACTSUMMA=100
18 MMF
 
07.10.14
13:45
WHERE
        sale.datetime between ? and ?
        and ((sale.code in (1,3)) or ((sale.code = 4) and (
             sale.FACTSUMMA=100)))
19 Ёпрст
 
07.10.14
13:46
(16) and sale.FACTSUMMA = (case when sale.code=4 then 100 else sale.FACTSUMMA end)
20 Ёпрст
 
07.10.14
13:47
(17) зачет..
21 Ёпрст
 
07.10.14
13:49
а у меня чегой-то один кейс в башке.. :))
22 trad
 
07.10.14
13:51
(20) да, профессор
23 Ёпрст
 
07.10.14
13:52
(22) ну блин, с тобой на бентли не заработаешь ©
24 zsergey
 
07.10.14
13:54
(17, 18) СПАСИБО РЕБЯТА!
25 zsergey
 
07.10.14
13:55
(19  тоже СПАСИБО!
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший