Согласованность базы данных с SQL Order By и nulls
-
11-07-2019 - |
Вопрос
У меня есть столбец в моей базе данных (флаг) с типом varchar (1), который заполняется либо Y, либо NULL (так оно и есть, не в моей власти).
В SQL Server, выполняющем запрос в порядке возрастания, NULL упорядочивается вверху.Должно ли такое поведение быть согласованным для Oracle и DB2?
Если вместо этого у меня есть COALESCE в столбце, чтобы убедиться, что он не равен null в запросе, могу ли я столкнуться с какими-либо проблемами с производительностью (из-за сканирования таблицы и тому подобного)?
Редактировать
Запрос должен быть согласован по всем 3 базам данных, в противном случае мне придется обрабатывать его в коде, поэтому я думаю об использовании функции COALESCE
Редактировать
Я выбрал Pax в качестве ответа, поскольку он касался обеих частей вопроса и, однако, дал полезный обходной путь, спасибо мне.yahoo.com/a/P4tXrx за ссылку на здесь
Решение
Я точно знаю, что DB2 Express и DB2 (по крайней мере, до версии 8) делают не поддерживать NULLS FIRST
оговорка.
Если вам нужно портативное решение, возможно, вам придется выбрать что-то вроде:
select * from tbl where fld is null
union all select * from tbl where fld is not null
Я думаю, что результат объединения (по крайней мере, в DB2, вам нужно будет проверить остальные) гарантированно будет упорядочен правильно.
Слияние будет это влияет на производительность, поскольку вы запускаете функцию для каждой возвращаемой строки.Однако это зависит от количества строк в базе данных.
Вполне возможно, вам придется прибегнуть к выполнению двух запросов в коде к двум разным наборам записей, а затем обрабатывать их по порядку.
Редактировать:Я только что проверил стандарт SQL, и это не гарантирует, что запросы соединяются с UNION ALL
упорядочены;они могут быть взаимосвязаны.Таким образом, похоже, что вам, возможно, придется прибегнуть к коду, выполняющему два разных запроса, как упоминалось выше.
Другие советы
В SQL Server, выполняющем запрос в порядке возрастания, NULL упорядочивается вверху.Должно ли такое поведение быть согласованным для Oracle и DB2?
По-видимому, это относительный новичок в стандарте.
Основные функциональные возможности стандарта SQL явно не определяют порядок сортировки по умолчанию для нулей.С расширением SQL: 2003 T611, "Элементарные операции OLAP", нули могут быть отсортированы до или после всех значений данных с помощью предложений NULLS FIRST или NULLS LAST списка ORDER BY соответственно.Однако не все поставщики СУБД реализуют эту функциональность.Поставщики, которые не реализуют эту функциональность, могут указывать различные методы обработки нулевой сортировки в СУБД.
В oracle вы можете сделать это:
ORDER BY value NULLS FIRST
или
ORDER BY value NULLS LAST
Попробуйте это в SQL Server