Модераторы: Akella

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос с IF 
V
    Опции темы
TaNK
Дата 24.1.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



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

Код

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



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
password
Дата 24.1.2011, 12:49 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: нет
Всего: 8



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

...
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;

PM MAIL Skype   Вверх
Akella
Дата 24.1.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



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 - это тоже самой, что и процедура
PM MAIL   Вверх
Deniz
Дата 24.1.2011, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



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



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
TaNK
Дата 24.1.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Уважаемые, я уверен что в этой таблице будет всего одна запись, и мне хранимые процедуры или функции не подходят, мне в 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

Это сообщение отредактировал(а) TaNK - 24.1.2011, 14:35


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Akella
Дата 24.1.2011, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



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

это где ты такой запрос выполняешь, в чём?
PM MAIL   Вверх
TaNK
Дата 24.1.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



http://fotoifolder.ru/view_foto/er0j5lc4odvr/

Query Analyzer 
SQL SErver 2000 

Это сообщение отредактировал(а) TaNK - 24.1.2011, 15:00


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Deniz
Дата 24.1.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
TaNK
Дата 24.1.2011, 16:21 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



вот как подсказали сделать 
Код

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



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Deniz
Дата 25.1.2011, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



TaNK, т.е. про exists ты слышать не хочешь.
Ну удачи.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
TaNK
Дата 25.1.2011, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



про 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



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Deniz
Дата 25.1.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
TaNK
Дата 25.1.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Код

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

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


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Deniz
Дата 25.1.2011, 12:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(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
но в данном случае это не критично.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
TaNK
Дата 25.1.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Deniz,  спасибо за наставления!


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0937 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.