Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не догоняю логику FB :-( / 21 сообщений из 21, страница 1 из 1
26.02.2004, 15:57
    #32422789
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Привет! Создал вот процедуру:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE PROCEDURE TEST (
  ZZZ INTEGER )
RETURNS (
  RESULT VARCHAR( 10 ) )
AS
BEGIN
  IF (ZZZ IN ( 1 , 2 )) THEN
    RESULT='TRUE';
  ELSE
    RESULT='FALSE';
  SUSPEND;
END


и ещё одну прямо противоположную:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE PROCEDURE NOT_TEST (
  ZZZ INTEGER )
RETURNS (
  RESULT VARCHAR( 10 ) )
AS
BEGIN
  IF (NOT ZZZ IN ( 1 , 2 )) THEN
    RESULT='TRUE';
  ELSE
    RESULT='FALSE';
  SUSPEND;
END


Потом выполняю запрос:
Код: plaintext
1.
2.
3.
SELECT
  (SELECT RESULT FROM TEST(NULL)) AS TEST,
  (SELECT RESULT FROM NOT_TEST(NULL)) AS NOT_TEST
FROM RDB$DATABASE


В результате получаю FALSE FALSE

Разве это правильно?
...
Рейтинг: 0 / 0
26.02.2004, 16:03
    #32422805
VF
VF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
а числа в качестве параметра засылать пробовал?
...
Рейтинг: 0 / 0
26.02.2004, 16:07
    #32422819
Andrey_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
>Gold
Ну как же батенька... null это неопределенное значение. А раз неопределенное значение, значит ни проверку (ZZZ IN (1,2)) ни проверку (NOT ZZZ IN (1,2)) произвести невозможно, значит False
...
Рейтинг: 0 / 0
26.02.2004, 16:14
    #32422834
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
С числами нормально, но они меня мало волнуют...
Если поразмыслить логически, то у нас щас логика двухзначная, т.е. выражение ZZZ IN (1,2) при ZZZ=NULL даст FALSE.
Аналогично FALSE будет при ZZZ NOT IN (1,2).
Но выражение NOT FALSE=TRUE, поэтому я ожидаю что процедура NOT_TEST вернёт мне 'TRUE', ибо сначала вычисляется ZZZ IN (1,2), а потом результат этого вычисления инвертируется...

В чём я не прав?
...
Рейтинг: 0 / 0
26.02.2004, 16:33
    #32422902
Kull Damned
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Просто такая логика принята во всех СУБД для того и введен is null, ты же не сравниваешь Field!=Null... Это надо смотреть в недра теории.
...
Рейтинг: 0 / 0
26.02.2004, 16:37
    #32422925
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Если поразмыслить логически, то у нас щас логика двухзначная, т.е. выражение ZZZ IN (1,2) при ZZZ=NULL даст FALSE.

Null - это неопределенное значение. Поясняю на примере:
В одном кармане хрен знает сколько денег, и в другом - столько же. Значит, по твоему, в обоих карманах одинаковое их число...

Ты понял?
...
Рейтинг: 0 / 0
26.02.2004, 16:42
    #32422944
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
2 Gold:
Не прав в том что проверка и не проводится, поскольку:
авторА раз неопределенное значение, значит ни проверку (ZZZ IN (1,2)) ни проверку (NOT ZZZ IN (1,2)) произвести невозможно, значит False
...
Рейтинг: 0 / 0
26.02.2004, 16:52
    #32422978
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
2 mv:

Ну смотри: в одном кармане у нас непонятно сколько денег и во втором непонятно склько денег. Если сравнить количество денег в двух карманах, то мы должны получить UNKNOWN в трёхзначной логике и FALSE в двузначной.

Чего я ожидаю в процедуре для такого условия:
IF (NOT(NULL=1))

1) Здесь есть два оператора: = и NOT.
2) По приоритету сначала выполняется сравнение NULL=1
3) Результатом этого сравнения должен быть FALSE, поскольку логика двузначная.
4) После предыдущего этапа наше выражение должно быть эквивалетнтно
IF (NOT(FALSE))
5) В результате мы должны получить TRUE, а получаем FALSE

В каком именно пунке я не прав?
...
Рейтинг: 0 / 0
26.02.2004, 16:54
    #32422984
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
2 Sclif

Правильно, проверку произвести невозможно и значит false, а (not false)=true.
...
Рейтинг: 0 / 0
26.02.2004, 17:06
    #32423037
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
В каком именно пунке я не прав?

Старперы, разрабатывающие стандарты SQL92/92... подумали, и решили, что ВСЕГДА сравнение с NULL дает NULL. А Вот "IF" не понимает троичной логики, это не женщина. На сравнение (>,<, <> ) с NULL всегда результат должен быть "FALSE". Чтобы проверить, "а не Null ли это" - есть операция "IS".

Так что ты должен был написать:

CREATE PROCEDURE TEST (
ZZZ INTEGER )
RETURNS (
RESULT VARCHAR(10) )
AS
BEGIN
IF (ZZZ IS NULL) THEN BEGIN
RESULT='TRUE'; /* Или что там хочешь, хоть NULL */
SUSPEND;
EXIT;
END

IF (ZZZ IN (1,2)) THEN
RESULT='TRUE';
ELSE
RESULT='FALSE';
SUSPEND;
END
...
Рейтинг: 0 / 0
26.02.2004, 17:18
    #32423076
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Да знаю я про IS NULL - не в том дело.
Тут вопрос принципиальный. Как по мне, то тут IF неправильно работает. И сравнение с NULL даёт UNKNOWN, а не NULL, и то это в трёхзначной логике, которую я считаю злом...
...
Рейтинг: 0 / 0
26.02.2004, 17:20
    #32423082
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Пишите в "СпортЛото"...
...
Рейтинг: 0 / 0
26.02.2004, 17:26
    #32423099
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
У меня конференция не работает с самого утра на news://forums.demo.ru
У вас тоже?
...
Рейтинг: 0 / 0
26.02.2004, 17:36
    #32423130
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Тоже не работает...
...
Рейтинг: 0 / 0
26.02.2004, 17:36
    #32423133
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
2 Gold:
А помоему все логично. NULL - это хрен знает сколько.
Ты спрашиваешь, хрен знает сколько это 1 или 2? Что тебе могут ответить? Конечно: а хрен его знает :) Потом ты говоришь, а НЕ хрен его знает это что? На что тебе тоже резонно отвечают: а тоже хрен его знает :) Поскольку не истина, то и идут на ELSE.

авторIF (condition)
THEN compound_statement
[ELSE compound_statement]

Tests condition, and if it is TRUE, performs the statement or block following THEN; otherwise, performs the statement or block following ELSE, if presentcondition: a Boolean expression (TRUE, FALSE, or UNKNOWN), generally two expressions as operands of a comparison operator
...
Рейтинг: 0 / 0
26.02.2004, 17:43
    #32423144
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Да, если аргументы - цитата на английком, то добавить уже не чего...

Впрочем, присоединяюсь.
...
Рейтинг: 0 / 0
26.02.2004, 17:56
    #32423177
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Блин, я почему-то думал что результат в IB не может быть UNKNOWN и всё приводиться к двухначной логике.
Бес меня попутал видать. Всем спасибо - всё понятно...
...
Рейтинг: 0 / 0
26.02.2004, 18:46
    #32423284
tria
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
IF (NOT ZZZ IN (1,2))
По логике (булевой алгебры) сначала вычисляется Not Null, что наверное даст Null а потом проверяется Null in (1,2).
Так что по-моему все работает правильно.
Или надо копать доку: что имеет больший приоритет: операция Not (как мне кажется) или in
А еще лучше написать:
IF NOT (ZZ IN (1,2))
и не иметь проблем снеопределенностью Not Null и чем оно будет в каком-нибудь новом релизе.
...
Рейтинг: 0 / 0
02.03.2004, 17:20
    #32428356
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
авторДа, если аргументы - цитата на английком, то добавить уже не чего...
Это цитата из SQL Reference от IB 6.0 далеко не копал, думаю что базовые вещи как эта не изменились и в FB.
...
Рейтинг: 0 / 0
02.03.2004, 17:23
    #32428362
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Да, не на английском, а на SQL...
...
Рейтинг: 0 / 0
11.03.2004, 14:19
    #32438040
Leron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не догоняю логику FB :-(
Null - ето костанта , указывающая что значение переменной(экземпляра) ПУСТО! - поетому оно всегда False при таких сравнениях с числами!
а сравнение с числом подразумевает что в переменной что то есть конкретное!! для корректного сравнения надо делать IS NULL
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не догоняю логику FB :-( / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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