Мы только что обнаружили странное поведение в 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
);
Может кто-нибудь объяснить, почему это произошло? Как это предотвратить? спасибо