Почему порядок сортировки varchar Oracle не соответствует поведению сравнения varchar?

Оператор 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 и соответствует поведению сравнения. Но я до сих пор не знаю, почему это происходит.

9
задан double-beep 1 February 2019 в 15:52
поделиться