Как сортировать по номерам сначала с помощью Oracle SQL -запроса?
-
29-09-2019 - |
Вопрос
У меня есть эта таблица с полем «заголовка», которое является varchar2, и я хочу выбрать все строки и отсортировать их по номеру, а затем по алфавиту, как это обычно происходит.
Например, в настоящее время я получаю это с помощью простого ORDER BY title
в конце:
- Азбука
- Дефект
- 321
Но я хочу это:
- 321
- Азбука
- Дефект
Странно то, что разработчик SQL показывает «правильный» заказ, сначала с цифрами. Но в моем приложении (PHP с использованием OCI8) это показывает последние номера.
Решение
Не эксперт Oracle, но вы должны иметь возможность сделать это, не изменяя сеанс с
SELECT * FROM my_data SORT by NLSSORT(title,’NLS_SORT=BINARY_AI’)
где вы можете изменить NLS_SORT=
Чтобы соответствовать вашим потребностям (вот список ценности)
Имейте в виду, что Docs говорит, что это заставит сканирование таблицы, поэтому может быть полезно первым фильтровать их (но если вы выбираете все сканирование таблицы - это то, что вы собираетесь использовать в любом случае).
Причина, по которой разработчик SQL демонстрирует различное поведение, вероятно, заключается в том, что он меняет сеанс.
Другие советы
разница в поведении, которое вы видите, вероятно, из -за разных NLS_SORT
установка параметра. Рассмотреть возможность:
SQL> select * from nls_session_parameters where parameter='NLS_SORT';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_SORT BINARY
SQL> SELECT * FROM my_data order by title;
TITLE
-----
321
Abc
Def
SQL> alter session set nls_sort=french;
Session altered
SQL> SELECT * FROM my_data order by title;
TITLE
-----
Abc
Def
321
Вы можете построить запрос, который должен дать вам ожидаемый результат независимо от вашего NLS_SORT
Настройка параметра сеанса, например:
SQL> SELECT *
2 FROM my_data
3 ORDER BY CASE
4 WHEN regexp_like(title, '[0-9]+\.?[0-9]*') THEN
5 1
6 ELSE
7 2
8 END, title;
TITLE
-----
321
Abc
Def