Как сортировать по номерам сначала с помощью Oracle SQL -запроса?

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

Вопрос

У меня есть эта таблица с полем «заголовка», которое является 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top