Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Запрос с IF


Автор: TaNK 24.1.2011, 10:48
Уважаемые, есть скрипт написанный мною и работающий в MS SQL 2000 а вот такой же но в firebird не могу сделать

Код

IF ((SELECT main_subver FROM common) = 21 AND (SELECT db_ver_n_sub FROM common) = 17 ) 
begin
          --действия 
end
else
          --действия
 

Автор: password 24.1.2011, 12:49
Для функций и процедур, что-то типа этого:
Код

...
declare variable t_main_subver numeric(12,0); -- Указать тип данных для поля main_subver
declare variable t_db_ver_n_sub numeric(12,0); -- Указать тип данных для поля db_ver_n_sub
BEGIN
for SELECT  first 1 main_subver, db_ver_n_sub FROM common  into :t_main_subver, :t_db_ver_n_sub  do
 begin
     if (:t_main_subver=21 and :t_db_ver_n_sub=17) then
     begin
       ...
     end else begin
       ...
     end
 end
END;

Автор: Akella 24.1.2011, 13:16
if exists...

Добавлено через 1 минуту и 44 секунды
Код

execute block
as
begin
if (exists(select id from OBJNAME where id = 53)) then
  update objname set id=53, name= 'Предложения - заявки на покупку (клиенты)' where id = 53;
else
  insert into OBJNAME (id, name) values (53,'Предложения - заявки на покупку (клиенты)');
end

execute block - это тоже самой, что и процедура

Автор: Deniz 24.1.2011, 14:18
TaNK, не совсем правильно делать такой IF. А что если запрос вернет несколько записей?
Лучше использовать, как уже сказал Akella
Код
if (exists(select 1 from common where main_subver = 21 and db_ver_n_sub = 17)) then ... else ... end

Автор: TaNK 24.1.2011, 14:31
Уважаемые, я уверен что в этой таблице будет всего одна запись, и мне хранимые процедуры или функции не подходят, мне в IF нужно проверить на true или false и выполнить дейтвия над данными, в MS SQL это легче легкого, но вот тут я столкнулся с проблемой.

Код

IF ((SELECT main_subver FROM common) = 21 AND (SELECT db_ver_n_sub FROM common) = 17 ) 
begin
          UPDATE common SET db_ver_n_sub = 18
end
 во так я делаю в MS SQL

Автор: Akella 24.1.2011, 14:50
TaNK, тебе ж уже ответили

Добавлено @ 14:50
Цитата(TaNK @  24.1.2011,  14:31 Найти цитируемый пост)
во так я делаю в MS SQL

это в DSQL??

Добавлено @ 14:51
Цитата(TaNK @  24.1.2011,  14:31 Найти цитируемый пост)
IF ((SELECT main_subver FROM common) = 21 AND (SELECT db_ver_n_sub FROM common) = 17 ) 
begin
          UPDATE common SET db_ver_n_sub = 18
end

это где ты такой запрос выполняешь, в чём?

Автор: TaNK 24.1.2011, 14:59
http://fotoifolder.ru/view_foto/er0j5lc4odvr/

Query Analyzer 
SQL SErver 2000 

Автор: Deniz 24.1.2011, 16:15
TaNK, так запусти IBExpert и напиши в нем execute block будет тоже-самое.
А по запросу вообще прикольно, для таких update'ов if не нужен

Автор: TaNK 24.1.2011, 16:21
вот как подсказали сделать 
Код

execute block
AS
begin
  IF ((SELECT iif(main_subver=21 AND db_ver_n_sub=17, 1, 0) FROM common)=1) then
  begin
    //огромный блок
  end
end

Автор: Deniz 25.1.2011, 06:54
TaNK, т.е. про exists ты слышать не хочешь.
Ну удачи.

Автор: TaNK 25.1.2011, 08:35
про exists я все понял и даже сделал как все советовали, просто нужно все было это сделать не в хранимке, а про execute block  я не знал
Код

execute block
AS
begin
  if (exists(select * from system where num_ver_bd = 1) and exists(select * from system where sub_num_ver_bd = 0)) then
  begin
             -- огромный блок         
  end 
end

Автор: Deniz 25.1.2011, 10:28
TaNK, не тормози, вместо 2-х exists можно написать 1, и зачем выбирать все поля "*" в select?
exists проверяет есть ли хоть одна запись во внутреннем select, и кол-во полей не играет роли.

Автор: TaNK 25.1.2011, 10:43
Код

execute block
AS
begin
  if (exists (select num_ver_bd from system where num_ver_bd = 1 and sub_num_ver_bd = 0) ) then
  begin
            --огромный блок
  end

вы так имели ввиду?

Автор: Deniz 25.1.2011, 12:10
Цитата(TaNK @  25.1.2011,  12:43 Найти цитируемый пост)
вы так имели ввиду? 
вот теперь все ОК.
Если уж совсем придираться, то выборка значения num_ver_bd в select не обязательна, т.е. сервер потратит чуть-чуть доп. времени для возврата значения, которое потом нигде не используется.
Совсем правильно:
Код
execute block
AS
begin
  if (exists (select null from system where num_ver_bd = 1 and sub_num_ver_bd = 0) ) then
  begin
            --огромный блок
  end
но в данном случае это не критично.

Автор: TaNK 25.1.2011, 12:49
Deniz,  спасибо за наставления!

Автор: Frees 25.1.2011, 15:42
Цитата(Deniz @  25.1.2011,  13:28 Найти цитируемый пост)
не тормози, вместо 2-х exists можно написать 1, и зачем выбирать все поля "*" в select?

для exists пофик какие ты поля возвращаешь * ничем не отличается от null

Автор: Akella 25.1.2011, 17:42
а я вообще пишу
Код
 IF (not exists (SELECT 1 FROM

Автор: Deniz 26.1.2011, 06:19
Цитата(Frees @  25.1.2011,  17:42 Найти цитируемый пост)
для exists пофик какие ты поля возвращаешь * ничем не отличается от null 
я об этом уже писал.
Для понимания структуры запроса "*" и "null"/"1" одинаковы. Но если посмотреть какие операции сделает сервер при этих запросах, то для "*" будут доп. чтения системных таблиц на предмет списка полей и определение значений для этих полей.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)