PostgreSQLエラー「[42846]: ERROR: CASE/WHEN could not convert type money to integer」の対応

Published by

on

項目バージョン
PostgreSQL14.10
OSUbuntu 22.04
確認環境

「Money」型を数値のように扱おうとして以下のSQLを実行したところ、タイトルのエラーとなりました。

SELECT
	SUM(CASE B."TRANSACTIONTYPE" WHEN 0 THEN A."AMOUNT" ELSE 0 END) AS INCOMETOTAL,
	SUM(CASE B."TRANSACTIONTYPE" WHEN 1 THEN A."AMOUNT" * -1 ELSE 0 END) AS EXPENSETOTAL
FROM
	"RECORDS" A,
	"CATEGORIES" B
WHERE
	A."TRANSACTIONDATE" BETWEEN '2024/01/01' AND '2024/01/31'
	AND A."ACCOUNTID" = 1
	AND A."CATEGORYID" = B."ID" 
;

PostgreSQLでは内部的に「Money」型は「ロケール付きの文字列として保存されている」ようなので、対応としては数値型に変換する明示をしてやればよいようです。(「AMOUNT」の後に「::NUMERIC」をつける)

SELECT
	SUM(CASE B."TRANSACTIONTYPE" WHEN 0 THEN A."AMOUNT"::NUMERIC ELSE 0 END) AS INCOMETOTAL,
	SUM(CASE B."TRANSACTIONTYPE" WHEN 1 THEN A."AMOUNT"::NUMERIC * -1 ELSE 0 END) AS EXPENSETOTAL
FROM
	"RECORDS" A,
	"CATEGORIES" B
WHERE
	A."TRANSACTIONDATE" BETWEEN '2024/01/01' AND '2024/01/31'
	AND A."ACCOUNTID" = 1
	AND A."CATEGORYID" = B."ID" 
;

コメントを残す