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

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

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

  • азбука
  • Защита
  • 321

Но я хочу:

  • 321
  • азбука
  • Защита

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

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

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

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

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

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

разница в поведении, которую вы видите, вероятно, NLS_SORT настройкой параметра 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