Имя: Пароль:
1C
1С v8
священный NULL и сложение
,
0 Wobland
 
15.10.12
19:30
имеем запрос:
выбрать
сумма(Нечто.ЧтоТо)
из
(выбрать 20 как ЧтоТо
объединить
выбрать NULL) как Нечто

объединить все

выбрать NULL+20


в первом случае получаем 20, во втором таки NULL. вопрос: это у только у 1С так?
1 Aleksey
 
15.10.12
19:32
да
2 Aleksey
 
15.10.12
19:33
ибо нет типизации, т.е. типизация идет по первой переменной
3 SnarkHunter
 
15.10.12
19:36
нет
4 SnarkHunter
 
15.10.12
19:36
В t-sql тоже так
5 Wobland
 
15.10.12
19:37
вот, NULL на первом месте
выбрать первые 90
Нечто.ЧтоТо
поместить ВТ
из
(выбрать NULL как ЧтоТо
объединить все
выбрать 40) как Нечто
упорядочить по ЧтоТо;

выбрать сумма(ВТ.ЧтоТо) из ВТ как ВТ
6 Wobland
 
15.10.12
19:39
оказывается, NULL не всегда ЕСТЬ NULL? ;)
7 Kaidend
 
15.10.12
19:39
Агрегатные функции игнорируют NULL.
Любые арифмитические операции с NULL-ом дают NULL.
NULL не равен ничему, кроме нуля.

Подозреваю, что это стандарт SQL-92 и такое поведение одинаково во всех СУБД, его придерживающихся.
8 SnarkHunter
 
15.10.12
19:39
Странные выводы...
9 Kaidend
 
15.10.12
19:39
(7) Тьфу, не равен ничему, кроме NULL-а.
10 Kaidend
 
15.10.12
19:40
(2) порядок, кстати, в этом случае никакого значения не имеет
11 Wobland
 
15.10.12
19:41
(9) да и NULLу, если задуматься, тоже ;)

выбрать
выбор когда NULL=NULL тогда истина иначе ложь конец
объединить все
выбрать
выбор когда NULL<>NULL тогда истина иначе ложь конец
12 Kaidend
 
15.10.12
19:43
(11) ну, в общем, да :)
странно, зачем в SQL ввели отдельную конструкцию IS NULL...
13 Wobland
 
15.10.12
19:45
перефразирую Кайденда и уйду спать

Агрегатные функции игнорируют NULL.
Любые арифметические операции с NULL-ом дают NULL.
Любое сравнение с NULLом даёт ложь.

Подозреваю, что это стандарт SQL-92 и такое поведение одинаково во всех СУБД, его придерживающихся.

всем спасибо, доброй ночи
14 Aleksey
 
15.10.12
19:47
(13) Нет для этого настройка в скуле есть
15 Kaidend
 
15.10.12
19:48
(14) Для чего "этого"?
16 Aleksey
 
15.10.12
19:48
(15) Для Null
17 Нуф-Нуф
 
15.10.12
19:48
(9) нул и себе не равен
18 Aleksey
 
15.10.12
19:51
Для русской параметр называется "Объединение со значением null дает null"
19 Kaidend
 
15.10.12
19:51
(17) да, забыл
20 Aleksey
 
15.10.12
19:52
А вообще Законы таинственного NULL следующие:

NULL=NULL это False
NULL<>NULL это тоже False

Единственное, что True, так это:

SOMETHING IS NULL
21 Kaidend
 
15.10.12
19:53
(18) да, есть такое, оказывается, для MS SQL

http://msdn.microsoft.com/ru-ru/library/ms176056.aspx
22 rs_trade
 
24.10.12
17:32
(17) всегда?
23 Дык ё
 
24.10.12
18:00
(20) на самом деле

NULL=NULL это NULL
NULL<>NULL это тоже NULL
24 Reset
 
24.10.12
18:03
(23) False
25 MRAK
 
24.10.12
18:06
(1), (2) не правильно, также работает и pl/sql  в оракле
26 rs_trade
 
24.10.12
18:15
(23)(24) undefined
27 Reset
 
24.10.12
18:25
(26) Недопонял. В запросах 1С выражение null=null имеет вполне определенное булево значение, равно Ложь. Нет?
28 Reset
 
24.10.12
18:25
равное*
29 Wobland
 
24.10.12
18:31
(27) а приведи пример. возможно, к примеру, соединение по нулл=нулл не соединяет по той причине, что undef молча преобразуется в ложь..
30 zakidonoff
 
24.10.12
18:33
(23) (24) (25) (26) (27)
ВЫБОР
   КОГДА NULL = NULL
       ТОГДА ИСТИНА
   ИНАЧЕ ЛОЖЬ
КОНЕЦ

Возвращает Ложь.
Если проверка проходит, значит сравнение возвращает булево значение
31 Wobland
 
24.10.12
18:34
(30) или молча конвертируется? любая операция с нуллом даёт ложь - читал где-то
32 Reset
 
24.10.12
18:35
(29) Это отчасти вопрос был ;)
33 zakidonoff
 
24.10.12
18:36
(29) (30)

Если заменить NULL = NULL на неопределено, вылезет ошибка.
Автоматом не конвертируется.
34 Wobland
 
24.10.12
18:36
Любая операция сравнения с NULL (даже операция «NULL = NULL»), даёт в результате значение «неизвестность» (UNKNOWN)
© wiki:NULL_(SQL)

но википедия такая википедия. оттуда же:
NULL может присваиваться переменным и записываться в поля, независимо от объявленного типа данных этих переменных (полей);
35 Reset
 
24.10.12
18:37
(30) Темное это дело (хорошо, для меня темное)

ВЫБОР
   КОГДА НЕ (NULL = NULL)
       ТОГДА ИСТИНА
   ИНАЧЕ ЛОЖЬ
КОНЕЦ

тоже истину даст.
36 rs_trade
 
24.10.12
18:37
(30) нет. получается значение undefined, а оно отбрасывается логикой двоичных предикатов.

по твоей логике код ниже должен возвращать 999

select case when not (null=null) then 999 else 111 end
37 rs_trade
 
24.10.12
18:38
(34) во, наверное UNKNOWN, а не undefined. уже точно не помню. но суть та же.
38 Reset
 
24.10.12
18:39
(34)(36) Хотелось бы остаться в рамках языка запросов 1С, что вне его - я знаю еще хуже ;)

(36) Но ведь "Выбор когда undefined" не пропускает проверка синтаксиса
39 Reset
 
24.10.12
18:40
(37) В общем, в 1с, получается, нет описывающего результат типа? )
40 rs_trade
 
24.10.12
18:41
(38) У языка запросов 1С ноги растут ведь из ANSI-SQL, правда? Поэтому лучше разбираться на примере первоисточника.
41 rs_trade
 
24.10.12
18:47
А ведь null бывает еще иногда равен другому null
42 Reset
 
24.10.12
18:49
(41) Не мучай мои мозги под вечер ;)
43 Wobland
 
24.10.12
18:50
(41) я требую пример!
"NULL"=Прав("ДругойNULL", 4) не считается ;)
44 Reset
 
24.10.12
18:53
В языке 1С ТипЗнч(null=null) булево кстати
45 fisher
 
24.10.12
18:53
Аааа! Только не это! Опять! Сейчас Ненавижу1С накличите на свои головы :)
46 zakidonoff
 
24.10.12
18:56
(35) Ложь даст.
Пример лишь демонстрирует, что сравнение NULL = NULL проходит синтаксис условия в запросе.
А это возможно только если он дает тип булево. Вот и всё =)
С другой стороны, ни один из прочих допустимых типов 1С не преобразуется автоматически в булево.
Однако, при попытке напямую задать условие:
ВЫБОР
   КОГДА (NULL = NULL) = ЛОЖЬ
       ТОГДА ИСТИНА
   ИНАЧЕ ЛОЖЬ
КОНЕЦ
Выдает ошибку о том, что нельзя сравнивать значения неограниченной длинны со значениями простых типов.
Т.е. веря логике конфигуратора, выходит, что (NULL = NULL) - значение неограниченной длинны =)
47 rs_trade
 
24.10.12
18:58
(43) таких  случаев несколько. например group by считает null-ы равными. order by тоже. еще есть скульная операция над таблицами которает нуллы равными считает. union тоже сворачивает null-ы.
48 Reset
 
24.10.12
19:00
(46) да, я хотел сказать ложь, опечатался *-) (то есть "НЕ" не работает).
Впрочем, уважаемые Wobland и rs_trade растолковали, почему.
49 Reset
 
24.10.12
19:02
(46) Оно говорит что нельзя сравнивать значения несовместимых типов.
То есть, оператор НЕ к несовместимому типу применить можно (хоть получиться хз что), а сравнить с булевым нельзя :)
50 zakidonoff
 
24.10.12
19:03
(47) Это агрегатные функции, а не простые. По сути они не являются операциями сравнения.
51 Reset
 
24.10.12
19:04
КОГДА  (Не (NULL = NULL)) = Истина     Неверные параметры НЕ

КОГДА  (Не (NULL = NULL))     Все типа ок :)
52 rs_trade
 
24.10.12
19:06
(50) ну и что. в их случае же, нуллы равны между собой получаются.
53 Reset
 
24.10.12
19:07
Ладно, ну его нахер, а то ночью приснится
54 zakidonoff
 
24.10.12
19:12
(52) Это и так понятно было - в первых сообщениях подробно расписали.
55 rs_trade
 
24.10.12
19:14
(54) и таки group by и order by не агрегатные функции.
56 1C-band
 
24.10.12
19:15
Обалдели что ли?! Пардон глубочайше за мой французкий...

ЕСТЬNULL(ТвоеЗначение, 0) - и складывай с чем угодно.
57 zakidonoff
 
24.10.12
19:21
(55) Угу. Это вообще не функции с точки зрения 1С =)
(56) Да понятно всё это. Малина на в том ))
58 Wobland
 
24.10.12
19:21
(56) это всем понятно, разговор уже о высоких материях
59 Гинзбург
 
24.10.12
19:25
20+ NULL
еще не было ? (не скуль)
60 MRAK
 
24.10.12
19:29
(30) так нельзя
"null есть null" вернет истину
61 Гинзбург
 
24.10.12
19:31
(60)
1-(null = null)
62 1Страх
 
29.10.12
16:53
почувствуйте разницу

select sum(A+B), sum(A)+sum(B)
from ...
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн