Элегантный способ получить остаток от деления от единицы до делителя?

При обычном делении

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
→ Ссылка