コマンド道場

$ 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
namesalarysazettai
井上50500050005000
山本5120001200012000
田中5200002000020000
高橋480000-2000020000
伊藤5300003000030000
中村5300003000030000
吉田468000-3200032000
斎藤455000-4500045000

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 になります。符号付きゼロを区別したい場面では使えません。

次に読む

関係する関数

根拠にした一次情報