Сортировка таблицы по Null

Автор vlad77, 8 июня 2022, 22:20

0 Пользователи и 1 гость просматривают эту тему.

vlad77

       Здравствуйте. Как  отсортировать в таблице по полю дата1 (формат Date) сначала по возрастанию дат, а затем поля с Null значениями:
        Dim oControl      'Элемент управления - источник сообщения
   Dim oForms      'Коллекция форм
   Dim oForm      'Главная форма

   oControl = oEvent.Source
   oForms = oControl.getModel().getParent().getParent()
   oForm = oForms.getByName("Форма")
   oForm.Filter = "(""Выполнено""=false AND ""Дата1"">='#2022-06-08#')"  ' фильтр работает, б/3
   oForm.Order="Дата1 ASC, Текст='Контрольная' desc, Текст" ' сортировка работает, б/3 - но выводит сначала значения с полями Null столбца Дата1, а затем сортирует по возрастанию Дата1
' пробовал oForm.Order="Not Дата1 Is null ASC, Текст='Контрольная' desc, Текст"  --- ругается
   oForm.reload
   


Спасибо.

mikekaganski

Этот ответ на StackOverflow работает (проверил на Forebird Embedded и на HSQLDB Embedded):

SELECT * FROM "Table1" ORDER BY ( CASE WHEN "date" IS NULL THEN 1 ELSE 0 END ) ASC, "date" ASC

Предположительно и в коде можно задать

oForm.Order="( CASE WHEN Дата1 IS NULL THEN 1 ELSE 0 END ) ASC, Дата1 ASC, Текст='Контрольная' desc, Текст"
С уважением,
Михаил Каганский

eeigor

Поинтересуюсь:
Целая условная конструкция в теле запроса.
А просто функцию типа IIF() для вычисляемого поля использовать нельзя, как, например, в MS Access?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#3
Некоторые базы, например, Postgres, поддерживают конструкции NULLS { FIRST | LAST }.
Владимир.

vlad77

Спасибо. Зачтено! Проблема решена! (mikekaganski )

mikekaganski

#5
Цитата: eeigor от  9 июня 2022, 12:54просто функцию типа IIF()

Моё близкое общение с СУБД закончилось примерно в 1997, когда я писал несколько задач с использованием Borland Interbase. А с Access я вообще никогда близко не сталкивался, как кстати и с Base :)

Но решил посмотреть, что такое Iif в Access. Если я правильно понял и речь об этом, то замена

( CASE WHEN "date" IS NULL THEN 1 ELSE 0 END )

на

Iif("date" IS NULL, 1, 0)

не кажется глобальным упрощением даже с точки зрения внешнего вида запроса. А переносимость одного из этих вариантов делает его на мой взгляд однозначно предпочтительным.
С уважением,
Михаил Каганский

vlad77

Iif("date" IS NULL, 1, 0) - ругается