$ 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_id | gyo_no | suryo | tanka | saitei5 | jougen1000 |
|---|---|---|---|---|---|
| 1001 | 1 | 20 | 180 | 20 | 180 |
| 1001 | 2 | 30 | 120 | 30 | 120 |
| 1002 | 1 | 2 | 23800 | 5 | 1000 |
| 1002 | 2 | 1 | 18500 | 5 | 1000 |
| 1003 | 1 | 4 | 4200 | 5 | 1000 |
| 1003 | 2 | 2 | 8900 | 5 | 1000 |
| 1004 | 1 | 5 | 24800 | 5 | 1000 |
| 1005 | 1 | 10 | 180 | 10 | 180 |
17 行(うち 8 行を表示)
GREATEST は下限、LEAST は上限を作るのに使えます。
SELECT GREATEST(1, NULL, 3) AS pg_wa_null_mushi, LEAST(1, NULL, 3) AS least_mo_onaji
| pg_wa_null_mushi | least_mo_onaji |
|---|---|
| 3 | 1 |
1 行
Oracle と MySQL では、どちらも NULL になります。
説明
GREATEST は引数の中で最大、LEAST は最小の値を返します。
⚠️ MAX / MIN と混同しやすいのですが、向きがまったく違います。
MAX… 縦(行をまたいで)最大値を求める集約関数GREATEST… 横(同じ行の中で列をまたいで)最大値を求める関数
「予定日と実績日のうち遅いほう」「下限を割らないように 0 と比べる」のように、1 行の中で値を比べたいときに使います。
⚠️ PostgreSQL の GREATEST / LEAST は NULL を無視しますが、Oracle と MySQL では 1 つでも NULL があると結果が NULL になります。製品によって答えが変わる、数少ない関数の 1 つです。
次に読む
使い方を順に読むなら
根拠にした一次情報
- PostgreSQL 18 マニュアル: 条件式(2026-09-02 確認)