powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Проблема с условным оператором IF в FB2.0 (IBExpert)
35 сообщений из 35, показаны все 2 страниц
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35097663
Долгонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, не могу понять, в чем проблема.
Делаю примерно следующий запрос в IBExpert-редакторе к БД (FB2.0)

Код: plaintext
1.
2.
IF ( 1 = 1 )
  THEN insert into new_table (field1,field2) values ('value1','value2');
  ELSE insert into new_table (field1,field2) values ('value3','value4');

На что получаю следующее:

Код: plaintext
1.
2.
3.
4.
Invalid token.
Dynamic SQL Error.
SQL error code = - 104 .
Token unknown - line  1 , column  1 .
IF.

В документациях написано следующее:

Код: plaintext
1.
2.
3.
4.
5.
IF
Оператор IF..ELSE в СУБД Firebird имеет ту же семантику, что и в СУБД MS SQL, однако синтакс СУБД Firebird требует наличия ключевого слова THEN после условия. 

IF (something = 'unknown')
  THEN something = 'uuhhh.....';
  ELSE something = 'I know! I know!'; 

Уже достаточно давно работаю с этой БД, глюк впервые.
Подскажите пожалуйста, в чем проблема.
Заранее спасибо.
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35097687
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IF применим только в PSQL блоках: SP или EB.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35097702
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и в триггерах
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35097986
Долгонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
блин... я прошу прощения, но ничего не понял... :(

поставлю вопрос по-другому:
я могу как-нибудь вставить условную проверку в запрос на подобии этого к FB2.0?

Код: plaintext
1.
2.
3.
4.
5.
6.
AnsiString Query =
"select Field1 from new_table where Field2 = '0001'";
  IBDataSet1->Close();
  IBDataSet1->SelectSQL->Clear();
  IBDataSet1->SelectSQL->Add(Query);
  IBDataSet1->Open();

То есть, я могу вообще сделать проверку условия непосредственно в запросе?
IF, WHEN... не проходят.
Сорри, если чего не понял
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35097999
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долгонос
То есть, я могу вообще сделать проверку условия непосредственно в запросе?

Да, в запросах для этого есть WHERE. Ты бросай свои "наподобии", говори
конкретно какую проблему пытаешься наскрести.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35098000
SAMZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Копай CASE, мне кажется это тебе поможет
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35098040
Bulygin Roman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На выбор.

Код: plaintext
1.
2.
3.
4.
insert into new_table (field1,field2) 
values (IIF(:Something= 1 ,  100  ,  200 ),
        IIF(:Something= 1 , 'value2' , 'value4'))


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
insert into new_table (field1,field2) 
values (CASE :Something WHEN  1  THEN  100 
                        WHEN  2  THEN  133 
                        WHEN  7  THEN  160 
                        ELSE  199  END,
        CASE :Something WHEN  1  THEN 'о-хо-хо'
                        WHEN  2  THEN 'о-го-го!'
                        WHEN  7  THEN 'э-ге-гей!!'
                        ELSE 'нафик' END)

Хотя, конечно, проктология
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35098045
Долгонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Существует БД FB2.0, с которой контактирует моя программа.
На вход моей программы приходит набор строк, которые нужно распихать по таблице по такому правилу:
1) Если три первых первых столбца строки совпадают со столбцами некой строкой в БД, то эт строку нужно заменить новой.
2) Если такой комбинации полей не существует, новую строку нужно вставить в таблицу на новое место.

вопрос: Как это сделать?
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35098061
Bulygin Roman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и так далее, этаж за этажом...
Код: plaintext
1.
2.
3.
insert into new_table (field1,field2)
values (COALESCE(NULLIF(CAST(:Something AS INTEGER),  1 )|| 100  ,  200 ),
        COALESCE(NULLIF(CAST(:Something AS INTEGER),  1 )||'value2' , 'value4'))
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35098075
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долгоносвопрос: Как это сделать?

EXECUTE BLOCK + вдумчивое чтение http://www.ibase.ru/devinfo/testiu.htm
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35098098
Долгонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасиб!!! буду разбираться :)
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35098125
Bulygin Roman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДолгоносСуществует БД FB2.0, с которой контактирует моя программа.
На вход моей программы приходит набор строк, которые нужно распихать по таблице по такому правилу:
1) Если три первых первых столбца строки совпадают со столбцами некой строкой в БД, то эт строку нужно заменить новой.
2) Если такой комбинации полей не существует, новую строку нужно вставить в таблицу на новое место.

вопрос: Как это сделать?

1. Создать CREATE VIEW COPY_VIEW(SomeStr), у которой один единственный столбец аналогичен столбцам некой строке БД.
2. Написать этой вьюшке триггер на INSERT, в котором:
2.1. Проверить, существует ли комбинация полей, эквивалентная NEW.SomeStr
2.2. и если не существует, то распарсить строку и распихать всё по столбцам и/или таблицам
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Field1 = SUBSTRING(NEW.SomeStr FROM  1  FOR  5 ); -- Первые пять символов
Field2 = SUBSTRING(NEW.SomeStr FROM  6  FOR  15 ); -- ещё 15
Field3 = SUBSTRING(NEW.SomeStr FROM  21 ); -- всё, что осталось
IF (NOT EXISTS(SELECT * 
                 FROM OTHER_TABLE 
                WHERE Field1 =:Field1 
                  AND Field2 =:Field2 
                  AND Field3 =:Field3) ) THEN
    INSERT INTO OTHER_TABLE(Field1, Field2, Field3)
    VALUES(:Field1, :Field2, :Field3);
3. Сделать
Код: plaintext
1.
2.
INSERT TO COPY_VIEW(SomeStr) 
SELECT SomeStr 
  FROM SOME_TABLE
4. PROFIT!!!
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35098241
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bulygin RomanИ тебе стоит ту же статью перечитать. ИМХО.
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35099818
Bulygin Roman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery Bulygin RomanИ тебе стоит ту же статью перечитать. ИМХО.
Я не достаточно хорошо уверен в своих знаниях относительно курсоров, чтобы их применять. Впрочем, вы мне дали хороший пинок под зад, чтобы изучить эту область. Спасибо.
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35100484
UPPER_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bulygin Roman WildSery Bulygin RomanИ тебе стоит ту же статью перечитать. ИМХО.
Я не достаточно хорошо уверен в своих знаниях относительно курсоров, чтобы их применять. Впрочем, вы мне дали хороший пинок под зад, чтобы изучить эту область. Спасибо.

где почитать про курсоры и их применение в FB 2.0?
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35100544
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPPER> где почитать про курсоры и их применение в FB 2.0?

В релизнотах, как обычно.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35100764
UPPER_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а в книге Хелен Борри описано про использование курсоров?
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35100813
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPPER_а в книге Хелен Борри описано про использование курсоров?

Курсоры типа FOR SELECT..AS..DO у нее скорее всего описаны.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35101631
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPPER> а в книге Хелен Борри описано про использование курсоров?

Курсоры (declare cursor) - нет.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35102377
Долгонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена.
Статья помогла постолько поскольку...
Это круто, конечно - быстродействие рулит итд итп.
На всякий случай для себя (в будущем поможет возможно при поиске, или кому-нить, для кого случайные аббревиатуры типа "EB" ничего не значат)
просто кусок кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
EXECUTE BLOCK
        AS
        BEGIN
        IF (exists (select * from new_table where
            column1 = '1' and
            column2 = '2' and
            column3 = '3'
        ))
  THEN update new_table set
  column1 = 'a',
  column2 = 'b',
  column3 = 'c',
  column4 = 'd'
        where
            column1 = '1' and
            column2 = '2' and
            column3 = '3'
  else 
  insert into new_table (column1,column2,column3,column4) values ('e','f','g','h');

        END

PS: Я новичек, но в следующий раз обязательно буду делать к сообщению пометку "простите, но я даун"
PPS: да, тот код, который я запостил - это именно тот код, который мне был нужен для решения моей проблемы.
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35103569
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долгонос> просто кусок кода:

Не самый лучший по содержанию и ужасно оформленный кусок.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35104086
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долгоносаббревиатуры типа "EB"оффтоп:
кстати, раз SP переводится как ХП,
то как будет переводиться EB?
ВБ?
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35104131
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S.G.> оффтоп:
> кстати, раз SP переводится как ХП,
> то как будет переводиться EB?
> ВБ?

Нет, либо ЕБ, либо ИБ. А лучше никак не переводить и оставить EB (на латинском).


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35105598
Долгонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам
Не самый лучший по содержанию и ужасно оформленный кусок.

Знаю :)
я - плохой мальчик!
старался, старался - оформлял, понимаешь ли, рисовал заоблачные картины, но пришел Пикассо и упс... все не так, малыш...

Если серьезно, то тема оформления - вопрос, который меня давно тревожит. Маэстро, плз, если не затруднит, запостите мой кусок кода так, как Вы видите его "хорошо оформленным"
Может поучусь, может поспорю :)
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35105629
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДолгоносЕсли серьезно, то тема оформления - вопрос, который меня давно тревожит.
Маэстро, плз, если не затруднит, запостите мой кусок кода так, как Вы видите
его "хорошо оформленным" Может поучусь, может поспорю :)Сколько слов... Ну держите.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
EXECUTE BLOCK
AS --выравнивание
declare variable id integer;
BEGIN
    id = - 1 ;
    select First  1 
        id -- за * надо расстреливать
    from new_table
    where
        column1 = '1'
        and column2 = '2' -- непринципиально, главное, чтобы одинаково
        and column3 = '3'
    into :id;
    if ( id <> - 1  ) then
        update new_table set -- запрос странный
            column1 = 'a',
            column2 = 'b',
            column3 = 'c',
            column4 = 'd' -- точно-точно?
        where
            column1 = '1'
            and column2 = '2'
            and column3 = '3'
    else
        insert into new_table (column1,column2,column3,column4)
        values ('e','f','g','h');
END
По оформлению - приводить все к upper/lower не стал, лень.
По содержанию - некоторые вещи непонятны, например,
может быть там лучше update, хотя при правильных данных
select first 1 into должно хватить.
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106085
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я вот так пишу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
execute block as
begin
  update new_table
    set column1 = 'a', column2 = 'b', column3 = 'c', column4 = 'd'
    where column1 = '1' and column2 = '2' and column3 = '3';

  if (row_count =  0 ) then
    insert into new_table (column1, column2, column3, column4)
      values ('e', 'f', 'g', 'h');
end
"begin" бы тоже писал после "as", в первой строке, но тешу себя мыслью, что когда-нибудь IBExpert научится сворачивать блоки begin-end, как в дельфях, потому всё же так.
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106122
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, row_count у меня как-то не вошло в привычку по понятным причинам.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106323
Долгонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустамза * надо расстреливать
вот это не понял... почему? можешь пояснить плз? почему звездочка в данном случае - это плохо?

На счет оформления - в корне не согласен, но сильно спорить не буду. В любом случае, координально ничего нового для себя не заметил. Мой вариант меньше строчек кода занимает, как минимум.
У каждого свой стиль.
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106355
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долгонос> почему звездочка в данном случае - это плохо?

Звездочка плоха во всех случаях кроме как "проверочных запросов для себя".
В ХП, в приложениях, в еше где-то ее уже быть не должно. А в данном случае
(в exists) она вообще даром не далась, хотя он (exists) и плюнет на нее.

Долгонос> У каждого свой стиль.

Угу. Но выравнивание у всех бывает одно и то же в одном и
том же блоке, а не скачущее от строчки к строчке. Обычно.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106560
Bulygin Roman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Звездочка плоха во всех случаях кроме как "проверочных запросов для себя".


Т.е. идеологически правильно писать
SELECT COUNT(SomeField) FROM
а не
SELECT COUNT (*) FROM
?
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106587
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для count - пофиг.
для остальных запросов - нет, особенно для тех, которые набор данных возвращают клиенту.
просто, если вдруг ты решишь поменять порядок столбцов, или добавить столбец к таблице, то запросы с * "поедут", т.е. или приложение или процедура-триггер перестанут работать.
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106591
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправка - "или будут работать некорректно или перестанут работать"

и дополнение - count(*) и count(field) это не одно и то же (из-за вероятных null). см. langref.pdf или стандарт.

Syntax COUNT ( * | [ALL] value | DISTINCT value)
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106607
Доброго времени суток!

kdvи дополнение - count(*) и count(field) это не одно и то же (из-за вероятных null). см. langref.pdf или стандарт.

Кстати, а как более правильно - Count(*) или Count(1)?
Вроде бы в обоих случаях сейчас сервер прочтет всю версию записи, или есть таки разница?

С уважением, Евгений
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106739
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bulygin Roman> Т.е. идеологически правильно писать
> SELECT COUNT(SomeField) FROM
> а не
> SELECT COUNT (*) FROM
> ?

Ну, почти. Для count сказанное не относилось, поскольку
count - агрегат, я говорил о выборке столбцов. Но и для
count правильнее select count(PK)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с условным оператором IF в FB2.0 (IBExpert)
    #35106742
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузнецов Евгений> Кстати, а как более правильно - Count(*) или Count(1)?

Count(PK) :-)


Кузнецов Евгений> Вроде бы в обоих случаях сейчас сервер прочтет
Кузнецов Евгений> всю версию записи, или есть таки разница?

А при чем тут версии вообще?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Проблема с условным оператором IF в FB2.0 (IBExpert)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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