Как отсортировать по номерам сначала с Oracle SQL запрос? - PullRequest
7 голосов
/ 01 декабря 2010

У меня есть эта таблица с полем title, которое называется varchar2, и я хочу выбрать все строки и отсортировать их сначала по номеру, а затем по алфавиту, как обычно.

Например, в настоящее время я получаю это, используя простой ORDER BY title в конце:

  • Abc
  • Def
  • 321

Но я хочу это:

  • 321
  • Abc
  • Def

Странно то, что SQL Developer показывает «правильный» порядок, сначала с цифрами. Но в моем приложении (PHP использует OCI8) последние цифры отображаются.

Ответы [ 2 ]

12 голосов
/ 01 декабря 2010

Не эксперт Oracle, но вы должны быть в состоянии сделать это без изменения сеанса с помощью

SELECT * FROM my_data SORT by NLSSORT(title,’NLS_SORT=BINARY_AI’)

, где вы можете изменить NLS_SORT= в соответствии со своими потребностями (вот список значения )

Имейте в виду, что документы говорят, что это заставит сканирование таблицы, поэтому может быть полезно сначала отфильтровать их (но если вы выбираете все сканирование таблицы, то вы естьиспользовать в любом случае).

Причина, по которой SQL Developer демонстрирует другое поведение, вероятно, заключается в том, что он меняет сеанс.

5 голосов
/ 01 декабря 2010

Различие в поведении, которое вы видите, возможно, из-за различных параметров 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
...