У меня есть эта таблица с полем «title», которое является varchar2, и я хочу выбрать все строки и отсортировать их сначала по числу, а затем по алфавиту, как это обычно бывает.
Например, в настоящее время я получаю это, используя простой ORDER BY title
в конце:
Но я хочу:
Странно, что 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