$ man abs
ABS
数値関数絶対値を返す。整数の下限だけは絶対値を表せずエラーになる。
呼び出しの形
ABS(数値)
つまずきやすいところ
整数型の下限(-2147483648)は絶対値を表せず、実行時エラーになります。負の側が 1 つ広いためです。
ABS(NULL)は NULL です。0 ではありません。「近い順」に並べたいときは
ORDER BY ABS(差)が使えますが、その列のインデックスは使われなくなります。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT name, salary, salary - 500000 AS sa, ABS(salary - 500000) AS zettai FROM shain ORDER BY zettai LIMIT 8
| name | salary | sa | zettai |
|---|---|---|---|
| 井上 | 505000 | 5000 | 5000 |
| 山本 | 512000 | 12000 | 12000 |
| 田中 | 520000 | 20000 | 20000 |
| 高橋 | 480000 | -20000 | 20000 |
| 伊藤 | 530000 | 30000 | 30000 |
| 中村 | 530000 | 30000 | 30000 |
| 吉田 | 468000 | -32000 | 32000 |
| 斎藤 | 455000 | -45000 | 45000 |
8 行
符号を取ることで「近い順」に並べられます。
SELECT ABS((-2147483648)::int)
実行するとこうなります
ERROR: integer out of range
負の側が 1 つ広いので、範囲に収まりません。
説明
ABS は絶対値(符号を取った値)を返します。「差がどれくらいあるか」を向きを問わずに見たいときに使います。
⚠️ 整数型の下限だけは絶対値を表せません。integer の範囲は -2147483648 〜 2147483647 で、負の側が 1 つ広いためです。ABS(-2147483648) は範囲に収まらず、実行時エラーになります。実データで起きることは稀ですが、計算の途中で下限に触れると落ちます。
ABS(NULL) は NULL です。「差が 0」と「値が無い」は別なので、COALESCE で埋めるかどうかは要件で決めてください。
浮動小数点では ABS(-0.0) が 0 になります。符号付きゼロを区別したい場面では使えません。
次に読む
関係する関数
根拠にした一次情報
- PostgreSQL 18 マニュアル: 数学関数と演算子(2026-09-02 確認)