Элегантный способ получить остаток от деления от единицы до делителя?
При обычном делении
SELECT mod(6,3) a FROM dual;
Мы получим ноль. Если делить будем не 6, а 5 или 4, то получим 2 или 1 соотвественно. Есть ли красивый способ получить вместо нуля - делитель (3)? Как вариант:
SELECT case when mod(6,3) = 0 then 3 else mod(6,3) end a FROM dual;
Но такая конструкция смотрится слишком громоздко, да и деление приходится выполнять дважды..
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Предложенное уважаемым @EzikBro в комментариии решение это остаток от деления со смещением (modulo with offset). Отличный способ генерировать подпоследователности начиная с 1-цы:
select rn,
mod (rn, 3) mod,
mod (rn - 1, 3) + 1 subseq
from (
select rownum rn from dual connect by level<=9);
RN MOD SUBSEQ
---------- ---------- ----------
1 1 1
2 2 2
3 0 3
4 1 1
5 2 2
6 0 3
7 1 1
8 2 2
9 0 3