コマンド道場

$ man greatest-least

GREATEST / LEAST

条件・NULL の関数

並べた値の中で最大・最小を返す。列をまたいで比べるときに使う。

呼び出しの形

GREATEST(値1, 値2, ...)
LEAST(値1, 値2, ...)

つまずきやすいところ

  • MAX / MIN とは向きが違います。 GREATEST は同じ行の中(横)、MAX は行をまたいで(縦)です。

  • NULL の扱いが製品で違います。 PostgreSQL は無視しますが、Oracle と MySQL は結果が NULL になります。移植すると答えが変わります。

  • 引数の型はそろえてください。混ざっていると暗黙の型変換が起き、比べ方が思ったものと変わることがあります。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

下限・上限で頭打ちにする
SELECT juchu_id, gyo_no, suryo, tanka, GREATEST(suryo, 5) AS saitei5, LEAST(tanka, 1000) AS jougen1000 FROM juchu_meisai ORDER BY juchu_id, gyo_no
juchu_idgyo_nosuryotankasaitei5jougen1000
100112018020180
100123012030120
1002122380051000
1002211850051000
100314420051000
100322890051000
1004152480051000
100511018010180

17(うち 8 行を表示)

GREATEST は下限、LEAST は上限を作るのに使えます。

PostgreSQL は NULL を無視する
SELECT GREATEST(1, NULL, 3) AS pg_wa_null_mushi, LEAST(1, NULL, 3) AS least_mo_onaji
pg_wa_null_mushileast_mo_onaji
31

1

Oracle と MySQL では、どちらも NULL になります。

説明

GREATEST は引数の中で最大、LEAST は最小の値を返します。

⚠️ MAX / MIN と混同しやすいのですが、向きがまったく違います。

  • MAX(行をまたいで)最大値を求める集約関数
  • GREATEST(同じ行の中で列をまたいで)最大値を求める関数

「予定日と実績日のうち遅いほう」「下限を割らないように 0 と比べる」のように、1 行の中で値を比べたいときに使います。

⚠️ PostgreSQL の GREATEST / LEASTNULL を無視しますが、Oracle と MySQL では 1 つでも NULL があると結果が NULL になります。製品によって答えが変わる、数少ない関数の 1 つです。

次に読む

関係する関数

根拠にした一次情報