Select ... into ...: null или не null

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
ARM
Сообщения: 26
Зарегистрирован: 02 дек 2006, 13:27

Select ... into ...: null или не null

Сообщение ARM » 04 янв 2007, 12:37

Не знаю, бага ли это или нет, но ничего по данной проблеме в инете не нашел.

Итак, вроде элементарная логика:

declare variable Var int;
Var = 0;

select SomeField from Table
where Table.Field = <value>
into :Var;

Так вот, если селект выберет хоть одну строку, то в Var попадет значение поля SomeField, НО если селект ничего не выберет, то Var так и останется равен 0, хотя по логике должен быть обNULL`ен!

В чем проблема или я где-то урок в консерватории пропустил ?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 04 янв 2007, 13:26

Пропустил.

A:=5;
While Not F.Eof Do
Read(F,A);

чему должно быть равно А в случае пустого файла?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Select ... into ...: null или не null

Сообщение hvlad » 04 янв 2007, 13:39

ARM писал(а):НО если селект ничего не выберет, то Var так и останется равен 0, хотя по логике должен быть обNULL`ен!
По какой логике ?
ARM писал(а):В чем проблема или я где-то урок в консерватории пропустил ?
Пропустил

AL-GALI
Сообщения: 25
Зарегистрирован: 03 янв 2007, 15:24

Re: Select ... into ...: null или не null

Сообщение AL-GALI » 04 янв 2007, 13:40

ARM писал(а):Не знаю, бага ли это или нет, но ничего по данной проблеме в инете не нашел.

Итак, вроде элементарная логика:

declare variable Var int;
Var = 0;

select SomeField from Table
where Table.Field = <value>
into :Var;

Так вот, если селект выберет хоть одну строку, то в Var попадет значение поля SomeField, НО если селект ничего не выберет, то Var так и останется равен 0, хотя по логике должен быть обNULL`ен!

В чем проблема или я где-то урок в консерватории пропустил ?
Поведение логичное: select не выбрал НИ ОДНОЙ записи, поэтому переменная не изменилась.

Если вы попробуете тоже самое в виде
i = 0;
for select ...... into :Var do
begin
i = i + 1;
end

то при отсутствии выбранных селектом записей
1) Var не изменится
2) блок begin ... end не будет выполнен ни разу (i останется равной 0)

ARM
Сообщения: 26
Зарегистрирован: 02 дек 2006, 13:27

Сообщение ARM » 04 янв 2007, 13:51

Блин, сказывается упор в последнее время на Мелкософт :)

Сенкс.

AL-GALI
Сообщения: 25
Зарегистрирован: 03 янв 2007, 15:24

Сообщение AL-GALI » 04 янв 2007, 15:25

ARM писал(а):Блин, сказывается упор в последнее время на Мелкософт :)

Сенкс.
там иначе?

ARM
Сообщения: 26
Зарегистрирован: 02 дек 2006, 13:27

Сообщение ARM » 04 янв 2007, 19:34

AL-GALI писал(а):
ARM писал(а):Блин, сказывается упор в последнее время на Мелкософт :)

Сенкс.
там иначе?
да, мой пример дал бы результат null. Да и удобнее это! Т.к. в ФБ мне придется сначало проверить, а есть ли собственное данные по моему условию и если есть, только тогда их читать!

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 04 янв 2007, 20:21

ARM писал(а):
AL-GALI писал(а):
ARM писал(а):Блин, сказывается упор в последнее время на Мелкософт :)

Сенкс.
там иначе?
да, мой пример дал бы результат null
Конечно нет

Код: Выделить всё

declare @i int
set @i = 10

select top 1 @i = id from sysobjects
 where 0=1

select @i
-----------
10

(1 row(s) affected)

Ответить