Результат как Oracle запрос в SQL Server 2016 - PullRequest
2 голосов
/ 21 января 2020

В Oracle, например,

create table test1(Prod_Name varchar2(30))
insert into test1 values('CHANNEL')
insert into test1 values('SHELL')
insert into test1 values('_DISTRIBUTOR BELT')
select * from test1 order by prod_name asc

Запрос на выборку дает следующий результат

Prod_Name
CHANNEL
SHELL
_DISTRIBUTOR BELT

, но на SQL Сервере он дает следующий результат

Prod_Name
_DISTRIBUTOR BELT
CHANNEL
SHELL

Я хочу, чтобы результат был таким же, как Oracle на SQL Сервер, так как написать запрос. Чтобы уточнить, я хочу строки CHANNEL, SHELL и _DISTRIBUTOR BELT в последней

Ответы [ 2 ]

1 голос
/ 21 января 2020

Это сложно. Oracle и SQL Сервер имеет разные правила сортировки. Oracle по умолчанию выполняет двоичную сортировку , которая основана на значениях чисел c символов, определенных схемой кодирования символов (это самый быстрый метод).

Символ подчеркивания (_) имеет код ASCII 95, а AZ - от 65 до 90. Отсюда и результаты, которые вы видите.

Одним из способов получения ожидаемых результатов является выполнение linguisti c sort : с этой настройкой символы сортируются независимо от их числовых значений c в схеме кодирования символов .

Я поиграл с параметрами, и вот решение, которое сортируется, как и ожидалось:

select * from test1 order by nlssort(prod_name, 'nls_sort = punctuation')

Демонстрация на DB Fiddle

Обратите внимание, что это будет медленнее, чем двоичная сортировка.

1 голос
/ 21 января 2020

На SQL сервере вы можете принудительно сортировать при использовании COLLATE. Попробуйте этот скрипт ниже, и вы должны получить ожидаемый результат следующим образом.

DEMO HERE

SELECT * 
FROM test1 
ORDER BY prod_name 
    COLLATE SQL_Latin1_General_CP850_BIN2
...