|
|
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Привет! Создал вот процедуру: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. и ещё одну прямо противоположную: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Потом выполняю запрос: Код: plaintext 1. 2. 3. В результате получаю FALSE FALSE Разве это правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 15:57 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
а числа в качестве параметра засылать пробовал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 16:03 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
>Gold Ну как же батенька... null это неопределенное значение. А раз неопределенное значение, значит ни проверку (ZZZ IN (1,2)) ни проверку (NOT ZZZ IN (1,2)) произвести невозможно, значит False ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 16:07 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
С числами нормально, но они меня мало волнуют... Если поразмыслить логически, то у нас щас логика двухзначная, т.е. выражение ZZZ IN (1,2) при ZZZ=NULL даст FALSE. Аналогично FALSE будет при ZZZ NOT IN (1,2). Но выражение NOT FALSE=TRUE, поэтому я ожидаю что процедура NOT_TEST вернёт мне 'TRUE', ибо сначала вычисляется ZZZ IN (1,2), а потом результат этого вычисления инвертируется... В чём я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 16:14 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Просто такая логика принята во всех СУБД для того и введен is null, ты же не сравниваешь Field!=Null... Это надо смотреть в недра теории. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 16:33 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Если поразмыслить логически, то у нас щас логика двухзначная, т.е. выражение ZZZ IN (1,2) при ZZZ=NULL даст FALSE. Null - это неопределенное значение. Поясняю на примере: В одном кармане хрен знает сколько денег, и в другом - столько же. Значит, по твоему, в обоих карманах одинаковое их число... Ты понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 16:37 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
2 Gold: Не прав в том что проверка и не проводится, поскольку: авторА раз неопределенное значение, значит ни проверку (ZZZ IN (1,2)) ни проверку (NOT ZZZ IN (1,2)) произвести невозможно, значит False ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 16:42 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
2 mv: Ну смотри: в одном кармане у нас непонятно сколько денег и во втором непонятно склько денег. Если сравнить количество денег в двух карманах, то мы должны получить UNKNOWN в трёхзначной логике и FALSE в двузначной. Чего я ожидаю в процедуре для такого условия: IF (NOT(NULL=1)) 1) Здесь есть два оператора: = и NOT. 2) По приоритету сначала выполняется сравнение NULL=1 3) Результатом этого сравнения должен быть FALSE, поскольку логика двузначная. 4) После предыдущего этапа наше выражение должно быть эквивалетнтно IF (NOT(FALSE)) 5) В результате мы должны получить TRUE, а получаем FALSE В каком именно пунке я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 16:52 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
2 Sclif Правильно, проверку произвести невозможно и значит false, а (not false)=true. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 16:54 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
В каком именно пунке я не прав? Старперы, разрабатывающие стандарты 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 17:06 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Да знаю я про IS NULL - не в том дело. Тут вопрос принципиальный. Как по мне, то тут IF неправильно работает. И сравнение с NULL даёт UNKNOWN, а не NULL, и то это в трёхзначной логике, которую я считаю злом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 17:18 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Пишите в "СпортЛото"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 17:20 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
У меня конференция не работает с самого утра на news://forums.demo.ru У вас тоже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 17:26 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Тоже не работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 17:36 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 17:36 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Да, если аргументы - цитата на английком, то добавить уже не чего... Впрочем, присоединяюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 17:43 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Блин, я почему-то думал что результат в IB не может быть UNKNOWN и всё приводиться к двухначной логике. Бес меня попутал видать. Всем спасибо - всё понятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 17:56 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
IF (NOT ZZZ IN (1,2)) По логике (булевой алгебры) сначала вычисляется Not Null, что наверное даст Null а потом проверяется Null in (1,2). Так что по-моему все работает правильно. Или надо копать доку: что имеет больший приоритет: операция Not (как мне кажется) или in А еще лучше написать: IF NOT (ZZ IN (1,2)) и не иметь проблем снеопределенностью Not Null и чем оно будет в каком-нибудь новом релизе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2004, 18:46 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
авторДа, если аргументы - цитата на английком, то добавить уже не чего... Это цитата из SQL Reference от IB 6.0 далеко не копал, думаю что базовые вещи как эта не изменились и в FB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 17:20 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Да, не на английском, а на SQL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 17:23 |
|
||
|
Не догоняю логику FB :-(
|
|||
|---|---|---|---|
|
#18+
Null - ето костанта , указывающая что значение переменной(экземпляра) ПУСТО! - поетому оно всегда False при таких сравнениях с числами! а сравнение с числом подразумевает что в переменной что то есть конкретное!! для корректного сравнения надо делать IS NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:19 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32422789&tid=1579051]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
165ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 482ms |

| 0 / 0 |
