|   |   | 
| 
 | МАКСИМУМ в запросе зашкаливает | ☑ | ||
|---|---|---|---|---|
| 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 | 
        это стандартное поведение
 https://ru.stackoverflow.com/questions/749865/sql-maxid-Возвращает-пустой-массив-если-строк-нет | |||
| 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.". :-) | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |