Функция MIN в ORACLE и SQL Сервер работает по-разному - PullRequest
3 голосов
/ 07 августа 2020

Я пытаюсь преобразовать сценарий Oracle в сценарий SQL сервера. Но похоже, что моя функция MIN() не работает должным образом, поскольку она выполняется в Oracle.

Для SQL Сервер :

SELECT MIN(v)  
FROM (VALUES ('20013E17587A1_2'), ('20013E17587_2')) AS value(v);

Result: 20013E17587_2

Однако

Для ORACLE:

SELECT MIN(t.value)  
  FROM tab t;

Result: 20013E17587A1_2

Я получаю это в результате. Может кто-нибудь объяснить, почему такая разница и что можно сделать, чтобы получить такой же результат?

Ответы [ 2 ]

4 голосов
/ 07 августа 2020

Различные правила сортировки. Вы спрашиваете базу данных, считает ли она, что _ следует до или после A. По умолчанию Oracle использует двоичную сортировку (и кодовая точка 65, принадлежащая A, меньше, чем кодовая точка 95, принадлежащая _), в то время как SQL Server использует сопоставление базы данных по умолчанию, которое будет linguisti c упорядочивание, где _ считается предшествующей любой букве. Если вы хотите, чтобы сервер SQL демонстрировал идентичное поведение, используйте что-то вроде

SELECT MIN(v COLLATE Latin1_General_BIN2) 
FROM (VALUES ('20013E17587A1_2'), ('20013E17587_2')) AS value(v);

Фактическое правильное размещение COLLATE зависит от вашего «реального» запроса, а я полагаю, что это не так - вы может захотеть изменить сортировку самого столбца, например, в CREATE TABLE.

4 голосов
/ 07 августа 2020

Потому что Oracle ищет значение ASCII для каждого символа во время сравнения каждого соответствующего символа, упорядоченного в строке, при выполнении алфавитно-цифровой c сортировки. Это называется двоичная сортировка , которая по умолчанию для Oracle DB .

ASCII('A') равно 65 , а ASCII('_') равно 95 . Если бы строка была 20013E17587.2 вместо 20013E17587_2, то в результате вы получили бы 20013E17587.2, поскольку ASCII('.') равно 46 , что меньше 65 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...