Dense_rank порядка более 999 символов - PullRequest
0 голосов
/ 11 октября 2018

Мы только что обнаружили странное поведение в Oracle Database

select dense_rank() over (order by val) rank, val
from (
  select lpad('a', 998, 'a') || '0' val from dual
  union all
  select lpad('a', 998, 'a') || '1' val from dual
);

Вернется, как и ожидалось:

RANK |VAL       
-----|-----------------
1    |aaaa[...]aaaaa0
2    |aaaa[...]aaaaa1

Но затем мы добавим 1 символ

select dense_rank() over (order by val) rank, val
from (
  select lpad('a', 999, 'a') || '0' val from dual
  union all
  select lpad('a', 999, 'a') || '1' val from dual
);

И результат неожиданный:

RANK |VAL       
-----|-----------------
1    |aaaa[...]aaaaa0
1    |aaaa[...]aaaaa1

Поэтому я должен написать:

select dense_rank() over (order by val, substr(val, 999, 999)) rank, val
from (
  select lpad('a', 999, 'a') || '0' val from dual
  union all
  select lpad('a', 999, 'a') || '1' val from dual
);

Может кто-нибудь объяснить, почему это произошло? Как это предотвратить? спасибо

...