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
При явном использовании двоичной сортировки (order by NLSSORT(x,'NLS_SORT=BINARY_AI')
) результат равен B002AACD0A>978123456789>000000000000
и соответствует поведению сравнения. Но я до сих пор не знаю, почему это происходит.