振り分け処理みたいな


1なら1を
2なら2を
3なら3を
4なら1を
5なら2を
6なら3を
7なら1を
・・・

って感じの処理をOracleSQLで作りたくて。

CASE WHEN MOD(?, 3) = 0 THEN 3 ELSE MOD(?, 3) END

ってするのが一番明快かな?

個人的にCASE文そんなに好きじゃないので

MOD(? - 1, 3) + 1

ってしたんだけどもコレどっちが速いんだろう?

前者を使うメリット
・一般的に可読性が高い

後者を使うメリット
・各パラメータ(普通3もパラメータになるよね)の設定が各1回で済む
・僕はこっちの方が読みやすい


ちなみに0以下の数を考慮した場合。
※前者
0→3

  • 1→-1
  • 2→-2
  • 3→3
  • 4→-1
  • 5→-2
  • 6→3
  • 7→-1

※後者
0→0

  • 1→-1
  • 2→1
  • 3→0
  • 4→-1
  • 5→1
  • 6→0
  • 7→-1

どう見てもどちらもおかしい
来る値が保証されてる時しか使っちゃダメよ