Согласованность базы данных с SQL Order By и nulls

StackOverflow https://stackoverflow.com/questions/319384

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top