PostgreSQLのmoney型:分かりやすく解説!サンプルコード付き


money型とは?

money型は、固定小数点精度で通貨値を格納するために使用されます。小数点以下の桁数は、データベースのlc_monetary設定によって決定されます。デフォルトでは、2桁の精度が使用されます。money型の値の範囲は、-92233720368547758.08から92233720368547758.07までです。

money型の利点

  • 国際対応: money型は、ロケール設定に応じてさまざまな通貨形式で値を格納および表示できます。
  • 使いやすさ: money型は、他のデータ型と同様に簡単に行使できます。加算、減算、乗算、除算などの標準的な演算をmoney型に対して実行できます。
  • 安全性: money型は、データベース内で安全に格納されるため、データの破損や改ざんから保護されます。
  • 精度: money型は、固定小数点精度で値を格納するため、計算において丸め誤差が発生しません。これは、財務データなどの金銭的な正確性が重要な場合に特に重要です。

money型の使用方法

money型を使用するには、次のように宣言します。

CREATE TABLE products (
  product_id SERIAL PRIMARY KEY,
  product_name VARCHAR(255) NOT NULL,
  product_price MONEY NOT NULL
);

money型への値の代入には、次のようなリテラル形式を使用できます。

INSERT INTO products (product_name, product_price)
VALUES ('Laptop', 1299.99);

money型の値を取得するには、次のようにSELECT句を使用できます。

SELECT product_name, product_price
FROM products;

money型に関する注意点

  • money型は、ロケール設定に依存するため、money型の値を異なるロケールのデータベース間で転送する場合には注意が必要です。
  • money型は、浮動小数点型よりも精度が高いため、計算処理が少し遅くなります。

money型以外の選択肢

money型に加えて、PostgreSQLには他の数値データ型も用意されています。

  • double precision: double precision型は、8バイトの浮動小数点値を格納します。
  • real: real型は、4バイトの浮動小数点値を格納します。
  • decimal: decimal型は、numeric型と似ていますが、より多くのスケール桁数をサポートしています。
  • numeric: numeric型は、money型と同様に固定小数点精度で値を格納できますが、money型よりも桁数が多い値を格納できます。

money型を使用するかどうかを判断するには、データの精度要件、処理速度要件、および互換性要件を考慮する必要があります。



money型の値の挿入

次のコードは、productsテーブルに商品名と価格(money型)を挿入するものです。

INSERT INTO products (product_name, product_price)
VALUES
  ('Laptop', 1299.99),
  ('Smartphone', 799.99),
  ('Tablet', 499.99);

money型の値の取得

次のコードは、productsテーブルからすべての商品名と価格を取得するものです。

SELECT product_name, product_price
FROM products;

money型の値の演算

次のコードは、productsテーブルにあるすべての商品の価格の合計を計算するものです。

SELECT SUM(product_price) AS total_price
FROM products;

money型の値の書式設定

次のコードは、productsテーブルにあるすべての商品の価格を、現在のロケール設定に従って通貨形式で表示するものです。

SELECT product_name,
       TO_CHAR(product_price, '999.99') AS formatted_price
FROM products;

money型の値の条件付き検索

次のコードは、productsテーブルにある価格が500ドルを超えるすべての商品を取得するものです。

SELECT product_name, product_price
FROM products
WHERE product_price > 500.00;

これらの例は、PostgreSQLにおけるmoney型の基本的な使用方法を示すものです。money型を使用して、より複雑なクエリや操作を実行することもできます。

  • money型の値を他のデータ型に変換するには、キャスト演算子を使用できます。たとえば、money型の値をnumeric型に変換するには、次のようにします。
SELECT product_price::numeric AS numeric_price
FROM products;
  • money型の値を文字列に変換するには、TO_CHAR関数を使用できます。
SELECT TO_CHAR(product_price, '999.99') AS formatted_price
FROM products;
  • money型の値を比較するには、比較演算子を使用できます。たとえば、money型の値が500ドルを超えているかどうかを確認するには、次のようにします。
SELECT *
FROM products
WHERE product_price > 500.00;


numeric型

  • 短所:
    • 通貨に特化した機能が備わっていないため、money型ほど使いやすくありません。
    • ロケール設定に依存しないため、money型のように自動的に通貨形式で値を格納・表示することはできません。
  • 長所:
    • 固定小数点精度で値を格納するため、money型と同様に高い精度を維持できます。
    • money型よりも大きな桁数の値を格納できます。
    • 計算処理がmoney型よりも高速です。

decimal型

  • 短所:
    • numeric型と同様に、通貨に特化した機能が備わっていないため、money型ほど使いやすくありません。
    • numeric型よりも処理速度が遅くなります。
  • 長所:
    • numeric型と同様に、固定小数点精度で値を格納できます。
    • numeric型よりも多くのスケール桁数をサポートしています。
    • 複雑な金銭計算を必要とする場合に適しています。

real型

  • 短所:
    • 有限な精度しか持たないため、money型やnumeric型ほどの精度が要求される場面には適していません。
    • 計算処理において丸め誤差が発生する可能性があります。
  • 長所:
    • 4バイトの浮動小数点値を格納するため、money型よりも処理速度が速くなります。
    • 省スペースでデータを格納できます。

double precision型

  • 短所:
    • money型やnumeric型ほど精度が要求される場面には適していません。
    • real型よりも処理速度が遅くなります。
  • 長所:
    • 8バイトの浮動小数点値を格納するため、real型よりも高い精度を維持できます。
    • 複雑な計算を必要とする場合に適しています。
データ型長所短所適した用途
money型通貨に特化した機能、高い精度処理速度が遅い金銭データの一般的な格納、表示
numeric型高い精度、処理速度が速い通貨に特化した機能がない金銭データの格納、計算処理
decimal型多くのスケール桁数、複雑な計算処理に対応通貨に特化した機能がない、処理速度が遅い複雑な金銭計算
real型処理速度が速い、省スペース精度が低い、丸め誤差が発生する可能性がある概算値の格納
double precision型real型よりも高い精度、複雑な計算処理に対応money型やnumeric型ほど精度が要求される場面には適していない複雑な金銭計算

適切なデータ型の選択は、データの精度要件、処理速度要件、および互換性要件によって異なります。複数のデータ型を組み合わせて使用することも可能です。