powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не догоняю логику FB :-(
21 сообщений из 21, страница 1 из 1
Не догоняю логику FB :-(
    #32422789
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет! Создал вот процедуру:

Код: 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
Не догоняю логику FB :-(
    #32422805
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а числа в качестве параметра засылать пробовал?
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32422819
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Gold
Ну как же батенька... null это неопределенное значение. А раз неопределенное значение, значит ни проверку (ZZZ IN (1,2)) ни проверку (NOT ZZZ IN (1,2)) произвести невозможно, значит False
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32422834
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С числами нормально, но они меня мало волнуют...
Если поразмыслить логически, то у нас щас логика двухзначная, т.е. выражение 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
Не догоняю логику FB :-(
    #32422902
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто такая логика принята во всех СУБД для того и введен is null, ты же не сравниваешь Field!=Null... Это надо смотреть в недра теории.
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32422925
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если поразмыслить логически, то у нас щас логика двухзначная, т.е. выражение ZZZ IN (1,2) при ZZZ=NULL даст FALSE.

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

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

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

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

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

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

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

Старперы, разрабатывающие стандарты 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
Не догоняю логику FB :-(
    #32423076
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да знаю я про IS NULL - не в том дело.
Тут вопрос принципиальный. Как по мне, то тут IF неправильно работает. И сравнение с NULL даёт UNKNOWN, а не NULL, и то это в трёхзначной логике, которую я считаю злом...
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32423082
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишите в "СпортЛото"...
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32423099
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня конференция не работает с самого утра на news://forums.demo.ru
У вас тоже?
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32423130
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже не работает...
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32423133
Sclif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Не догоняю логику FB :-(
    #32423144
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, если аргументы - цитата на английком, то добавить уже не чего...

Впрочем, присоединяюсь.
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32423177
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, я почему-то думал что результат в IB не может быть UNKNOWN и всё приводиться к двухначной логике.
Бес меня попутал видать. Всем спасибо - всё понятно...
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32423284
tria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Не догоняю логику FB :-(
    #32428356
Sclif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторДа, если аргументы - цитата на английком, то добавить уже не чего...
Это цитата из SQL Reference от IB 6.0 далеко не копал, думаю что базовые вещи как эта не изменились и в FB.
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32428362
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не на английском, а на SQL...
...
Рейтинг: 0 / 0
Не догоняю логику FB :-(
    #32438040
Leron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Null - ето костанта , указывающая что значение переменной(экземпляра) ПУСТО! - поетому оно всегда False при таких сравнениях с числами!
а сравнение с числом подразумевает что в переменной что то есть конкретное!! для корректного сравнения надо делать IS NULL
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не догоняю логику FB :-(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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