Как заставить Oracle 'order by' вести себя как SQLServer? - PullRequest
2 голосов
/ 18 мая 2011

Я пытаюсь написать запрос Oracle, который сортирует результаты так же, как MS SQL Server.Я играю с функцией 'NLSSORT' и ее параметрами, но я не могу получить те же результаты, что и в MS SQL Server.

Контекст является общимсистема сбора данных, которая поддерживает Oracle и MS SQL Server.Это довольно старая система, которая все еще находится в стадии обслуживания и развития.Никакой объектной структуры или каких-либо недавних подходов для обработки взаимодействия с базой данных.

С помощью простого заказа на MS SQL Server я получаю такой результат:

_TEST
04-00031-IPE
04-00044-OG
0A-A
A0-A
SAZ2217

Тот же запрос в Oracle возвращает это:

04-00031-IPE
04-00044-OG
0A-A
A0-A
SAZ2217
_TEST

Я пробовал множество комбинаций параметров NLSSORT без какого-либо успеха.

[править]
Используя значение параметра NLS_SORT 'PUNCTUATION', я получаю результаты, очень близкие к сортировке MS SQL, но все еще есть различия с подстроками, которые содержат последовательности числовых символов.Вот пример результата запроса:

Oracle
0031-CASTOR-BLOC1-AV-AP
0031-CASTOR-BLOC1-AV-SP
0031-CASTOR-BLOC1-SV-AP
0031-CASTOR-BLOC1-SV-SP
0031-CASTOR-BLOC10-DV-AP
0031-CASTOR-BLOC10-DV-SP
0031-CASTOR-BLOC2-DV-AP

MS SQL
0031-CASTOR-BLOC10-DV-AP
0031-CASTOR-BLOC10-DV-SP
0031-CASTOR-BLOC1-AV-AP
0031-CASTOR-BLOC1-AV-SP
0031-CASTOR-BLOC1-SV-AP
0031-CASTOR-BLOC1-SV-SP
0031-CASTOR-BLOC2-DV-AP

Спасибо за вашепомощь!

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Я наконец нашел это решение:

ЗАКАЗАТЬ ПО NLSSORT (COLUMN_NAME, 'NLS_SORT = FRENCH_M')

По крайней мере, в моем конкретном контексте, я получаю одинаковую сортировку как для MS SQL Server (сортировка по умолчанию), так и для Oracle.

Вот две полезные ссылки:

http://www.myoracleguide.com/xl/Linguistic_Sorting_Frequently_Asked_Questions.htm

http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#NLSPG005

0 голосов
/ 31 мая 2017

Можно рассмотреть возможность использования функции rpad?

например

select name, rpad(upper(replace(translate(name,'_','+'),'-','') ),15,'0') as v1
from sorttest order by 
rpad(upper(replace(translate(name,'_','+'),'-','') ),15,'0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...