Сравнение неравенства между строками в Oracle

SELECT LAST_NAME FROM Employees
WHERE last_name < 'King';

В книге "Основы SQL I Руководство по экзаменам" говорится, что в сравнении LAST_NAME < 'King' происходит следующее преобразование в настройках NLS, предполагая набор символов базы данных US7ASCII с настройками AMERICAN NLS:

K + i + n + g = 75 + 105 + 110 + 103 = 393.

Затем для каждой строки в таблице EMPLOYEES таблицы столбец LAST_NAME аналогичным образом преобразуется в числовое значение. Если это значение меньше 393, то выбирается строка. Но когда я выполняю команду SELECT выше, в SQL*PLUS она возвращает строки (например, "Гринберг", "Бернештайн"), которые не следуют правилу, упомянутому в книге. Есть ли какие-либо настройки, которые мне нужно сделать, чтобы получить строки, которые удовлетворяют этому правилу?

2 ответа

Решение

Это правило, безусловно, не действует. Если бы это было так, то вы могли бы поменять местами символы, и вы все равно получили бы тот же результат 393, Но порядок сравнения символов имеет значение при сравнении слов.

Чтобы получить значение, подходящее для сравнения, вы должны рассчитать так:

K + i + n + g = ((75 × 256 + 105) × 256 + 110) × 256 + 103

Но вы бы превысили допустимый диапазон числовых значений для длинных слов. Для 7-битных кодов ASCII (строго в диапазоне 0 ... 127) вы также можете умножить на 128 вместо 256.

-

В действительности, значения сравниваются одно за другим, т.е. (в псевдокоде):

valueOf(last_name[0]) < 75 OR
valueOf(last_name[1]) < 105 OR
valueOf(last_name[2]) < 110 OR
valueOf(last_name[3]) < 103

... если сравнение останавливается на первом обнаруженном неравенстве или если достигнут конец одного из слов, сравниваются длины слов.

Другими словами, символы двух слов сравниваются символ за символом, пока не встретятся два разных символа. Тогда сравнение этих двух символов дает окончательный результат.

принимать 'Kelvin' < 'King' В качестве примера:

'K' < 'K' ==> false
'e' < 'i' ==> true
final result = true

Другой пример 'King' < 'Kelvin' (слова поменялись местами):

'K' < 'K' ==> false
'i' < 'e' ==> false, the characters are not equal, therefore stop
final result = false

Другой пример 'be' < 'begin':

'b' < 'b' ==> false
'e' < 'e' ==> false
end of first word reached, length('be') < length('begin') ==> true
final result = true

Фактическое сравнение двух символов выполняется путем сравнения их числовых значений, как вы уже упоминали.

Если это действительно то, что написано в книге, то книга дико и пугающе неверна. Если мы говорим о книге Oracle Press, я бы сильно подозревал, что вы неправильно истолковываете объяснение, потому что мне трудно представить, как эта ошибка может сделать это, не будучи пойманным автором, редактором или рецензентом,

Чтобы сравнить две строки, вы делаете то же самое, что делаете, когда вручную помещаете строки в алфавитном порядке. Строка "B" следует после строки "Все мои данные" и перед строкой "Изменения постоянно". Вы берете первый символ строки и смотрите на десятичное представление ("A" - 65, "B" - 66, "C" - 67) и порядок, основанный на этом. Если есть связи, скажем "Все данные" и "Все индексы", вы переходите ко второму символу и сравниваете, пока не сможете разорвать связь "D" - это 68, что меньше, чем "I", что составляет 73, поэтому "Все данные" "<" Все индексы ".

Другие вопросы по тегам