Имя: Пароль:
1C
1С v8
МАКСИМУМ в запросе зашкаливает
0 sprog
 
17.01.23
21:49
Неожиданно столкнулся со странным поведением запроса.

Если выполнить запрос к пустой таблице (не содержащей результатов) и выбрать максимум от единственного параметра без группировки, то вернётся не пустой результат с 1 строкой этого параметра содержащий ПУСТО.

Вот пример:

ВЫБРАТЬ
    ПустаяТаблица.Значение КАК Значение
ПОМЕСТИТЬ вт
ИЗ
    &ПустаяТаблица КАК ПустаяТаблица
;

ВЫБРАТЬ
    МАКСИМУМ(вт.Значение) КАК Значение
ИЗ
    вт КАК вт

никакие ЕСТЬNULL не помогают.
1 mikecool
 
17.01.23
21:51
сообщение не согласуется с темой
что не нравится в поведении? так, емнип ,было всегда
2 Мультук
 
гуру
17.01.23
22:00
(0)

Вот такой запрос выдает
NULL, ДА, "Да, это NULL"


У тебя твой запрос выдает что-то иное?

ВЫБРАТЬ
    МАКСИМУМ(Номенклатура.Код) КАК Код,
    МАКСИМУМ(Номенклатура.Код) IS NULL,
    ЕСТЬNULL(МАКСИМУМ(Номенклатура.Код), "Да, это NULL")
ИЗ
    Справочник.Номенклатура КАК Номенклатура            
ГДЕ 1=0
3 hockeyist
 
17.01.23
22:00
(0) А как должно быть по вашему?
4 sprog
 
17.01.23
22:06
(3) должен вернуться пустой результат не содержащий данных выборки
5 Garykom
 
гуру
17.01.23
22:21
6 timurhv
 
17.01.23
22:23
(4) И так тоже ничего не должно вернуть?

ВЫБРАТЬ
"ТЕСТ" КАК НовоеПоле,
МАКСИМУМ(вт.Значение) КАК Значение
ИЗ
    вт КАК вт


А если соединения с другими таблицами?
7 hockeyist
 
17.01.23
22:55
(4)
1. ВЫБРАТЬ Количество(*) что должно вернуть? Пустую выборку или 0?
2. Мы хотим сложить максимум одной таблицы с максимумом другой. Как это сделать при вашей системе?

Агрегатные функции всегда что-нибудь да возвращают. Это логично
8 Said_We
 
18.01.23
16:52
(0) Тогда ещё старый баян...

select 1 where null=null

На разных SQL получим разный результат. :-)

На MS SQL, Postgre и SQlite вернут пустое множество
MySQL вернет 1
Oracle ..... , а что вернет Oracle? :-)
9 NorthWind
 
18.01.23
17:12
(8) Ошибку. На Oracle нельзя написать запрос без from.
Если написать в соответствии с правилами оракла - select 1 from dual where null=null, то вернет пустое множество.
10 Said_We
 
18.01.23
17:14
(9) Правильно ошибку. Но если добавить from, то вернет 1 :-)
11 NorthWind
 
18.01.23
17:22
(10) нет. Я только что проверял на XE 11. Не возвращает строк.
12 Said_We
 
18.01.23
17:30
(11) Тоже проверил. В моей версии вернул 1.
13 yopQua
 
18.01.23
17:36
(0) все нормально, так было всегда, иногда это удобно использовать
14 Said_We
 
18.01.23
17:37
Причина проста. Спецификация Oracle отличается.
Согласно документации Oracle по NULL, нулевые сравнения с использованием IS NULL или IS NOT NULL вычисляют значение TRUE или FALSE. Однако все остальные сравнения оцениваются как UNKNOWN, а не FALSE.

Condition       Value of A    Evaluation
----------------------------------------
a IS NULL       10            FALSE
a IS NOT NULL   10            TRUE        
a IS NULL       NULL          TRUE
a IS NOT NULL   NULL          FALSE
a = NULL        10            UNKNOWN
a != NULL       10            UNKNOWN
a = NULL        NULL          UNKNOWN
a != NULL       NULL          UNKNOWN
a = 10          NULL          UNKNOWN
a != 10         NULL          UNKNOWN

Но Oracle менялся. И была такая рекомендация.
"В Oracle обрабатывает символьное значение с длиной, равной нулю, как null. Однако в будущих версиях это может измениться, и Oracle рекомендует НЕ обрабатывать пустые строки так же, как null.". :-)