SQLで絶対値を取得するにはABS関数を使う
SQLで値の絶対値を取得したい場合は「ABS関数」を使いましょう。
ABS関数はMySQLやOracle、PostgreSQLなど、さまざまなデータベースで使われる関数です。
この記事では、ABS関数の使い方を見ていきましょう。
ABS関数の使い方
ABS関数は次のように記述して使います。
SELECT ABS(数値);
ABS関数内に、絶対値を取得したい値を記述すればOKです。
実際に、MySQLで操作してみると次のように結果を取得できました。
mysql> SELECT ABS(12.34); +------------+ | ABS(12.34) | +------------+ | 12.34 | +------------+ 1 row in set (0.00 sec) mysql> SELECT ABS(-100); +-----------+ | ABS(-100) | +-----------+ | 100 | +-----------+ 1 row in set (0.00 sec)
正の値は正の値のまま返しており、負の数値の場合は「-1」を乗算した上で、符号を反転させた値を返しています。
もし、ABS関数の引数にNULLを入力した場合は、NULLを返します。
mysql> SELECT ABS(NULL); +-----------+ | ABS(NULL) | +-----------+ | NULL | +-----------+ 1 row in set (0.01 sec)
また、文字列型といった数値以外の値を指定した場合は「0」を返すので覚えておきましょう。
mysql> SELECT ABS('potepan'); +----------------+ | ABS('potepan') | +----------------+ | 0 | +----------------+ 1 row in set, 1 warning (0.00 sec)
浮動小数点型(FLOAT/ DOUBLE)の絶対値は誤差に注意
SQLで浮動小数点型のデータの絶対値を取得する際には、誤差が出るため注意して使いましょう。
浮動小数点数で数値の絶対値は「(仮数部)×(基数)^(指数部)」となるからです。
実際に確認してみると、次のような結果を取得します。
mysql> SHOW COLUMNS FROM sample_table; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | data | float | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.06 sec) mysql> SELECT ABS(data) FROM sample_table; +--------------------+ | ABS(data) | +--------------------+ | 123.56700134277344 | | 231.44500732421875 | | 156.72909545898438 | | 98.38999938964844 | | 226.19000244140625 | +--------------------+ 5 rows in set (0.00 sec)
このように、小数点以下が延々と続く可能性もあります。
【ABS関数を使うシーン】差を絶対値取得する
前項でABS関数の使い方を紹介しました。
ここでは、もう少し実際にABS関数を使う場面について見ていきましょう。
絶対値を取得するのは、主に「マイナス値で結果を取得したくない時」と言えます。
例えば、次のようなテーブルがあるとしましょう。
番号と名前、スコアが2つ用意されています。
mysql> SELECT * FROM my_table; +------+--------+---------+---------+ | id | name | score01 | score02 | +------+--------+---------+---------+ | 1 | Satou | 167 | 295 | | 2 | Katou | 256 | 196 | | 3 | Minami | 127 | 178 | | 4 | Ueki | 188 | 136 | | 5 | Inoue | 202 | 225 | +------+--------+---------+---------+ 5 rows in set (0.00 sec)
では、このスコアの差を取得してみましょう。
普通に差を取得すると次のように記述できます。
SELECT id, name, score01 - score02 AS score00 FROM my_table;
上記SQLを実行すると、次のように結果を取得できました。
mysql> SELECT id, name, score01 - score02 AS score00 FROM my_table; +------+--------+---------+ | id | name | score00 | +------+--------+---------+ | 1 | Satou | -128 | | 2 | Katou | 60 | | 3 | Minami | -51 | | 4 | Ueki | 52 | | 5 | Inoue | -23 | +------+--------+---------+ 5 rows in set (0.00 sec)
score02 の値の方が大きいデータのscore差は、マイナス値になっているのがわかります。
この差を絶対値で取得してみましょう。
次のように記述できます。
SELECT id, name, ABS(score01 - score02) AS score00 FROM my_table;
上記SQLを実行すると、次のように結果を取得できました。
mysql> SELECT id, name, ABS(score01 - score02) AS score00 FROM my_table; +------+--------+---------+ | id | name | score00 | +------+--------+---------+ | 1 | Satou | 128 | | 2 | Katou | 60 | | 3 | Minami | 51 | | 4 | Ueki | 52 | | 5 | Inoue | 23 | +------+--------+---------+ 5 rows in set (0.01 sec)
このように、スコアの値の差にマイナスがなくなりました。
マイナス値でなくなったので、スコア差が見やすくなっていますね。
まとめ
SQLで絶対値を取得する方法について解説しました。
絶対値を取得する際は、ABS関数を使いましょう。
使い方はとても簡単なので、ぜひこの記事を参考に絶対値の取得方法を理解してください!