Оператор SQL типа:
select * from (
select '000000000000' as x from dual
union
select '978123456789' as x from dual
union
select 'B002AACD0A' as x from dual
) /*where x>'000000000000'*/ order by x;
Выдает:
B002AACD0A
000000000000
978123456789
После раскомментирования ограничения WHERE результат:
B002AACD0A
978123456789
Я ожидал, что результат будет просто 978123456789
, поскольку B002AACD0A
возвращается до 000000000000
при выполнении запроса без ограничений.
Как можно объяснить такое поведение? И как я должен сортировать и сравнивать varchars, чтобы они могли работать вместе, как я могу делать с целыми числами?
Как ни странно, при изменении ограничения на x> 'B002AACD0A'
результат пуст . Изменение его на x> 978123456789
возвращает B002AACD0A
.
Т.е. при сравнении:
B002AACD0A > 978123456789 > 000000000000
Но при сортировке:
978123456789 > 000000000000 > B002AACD0A
При явном использовании двоичной сортировки ( порядок по NLSSORT (x, 'NLS_SORT = BINARY_AI')
), результат будет B002AACD0A> 978123456789> 000000000000
и соответствует поведению сравнения. Но я до сих пор не знаю, почему это происходит.