2020/09/14

Postgresで四捨五入をする

postgresql

概要

Postgreqlに格納されたデータに小数点の計算誤差があったため、一括で(小数点第1位まで)四捨五入してデータをパッチする必要があったため、調査して実施しました。

(Postgreqlはv12を使っています。)

SQL

mytable.my_column は double precision型です。

「(算術関数と演算子)」によると、round(v numeric, s int) を使えば良さそうなので

update my_table set my_column = round(my_column, 1);

を実行してみたところ・・以下のエラーが・・

HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

どうやら、castして、numeric型に変換してからroundしないといけないようでした。。。

update my_table set my_column = round(CAST(my_column as numeric), 1);

こちらでちゃんと動きました。

ちなみに update する前にちゃんとデータを確認する必要があるので、以下のような感じでリストアップしておくと良かったです。

select
    id
    , my_column as current_value
    , round(CAST(my_column as numeric), 1) as patched_value
  from
    my_table;

以上です。