PostgreSQL では、infinity 値は日付/時刻データ型や数値データ型で利用できる無限大を表す特殊な値です。この値は、他の多くのデータベースシステムではサポートされていないため、データ連携時には変換するなどの処理が必要です。本記事では、PostgreSQL の infinity 値を他のデータベースに連携するための方法について説明します。尚、次の対応方法はいずれもPostgreSQL コネクタのみで有効です。PostgreSQL (Native) コネクタの場合はネイティブではないPostgreSQL コネクタのご利用をご検討ください。
対応方法
PostgreSQL の infinity 値を他のデータベースに連携する際の対応方法として、以下の二つの方法があります。
A. replaceInvalidTypesWithNull を設定し、NULL 値で取り込む
PostgreSQL コネクタの接続設定の[高度な設定]->[Other] プロパティで以下のように設定すると、型不正と識別された値がNULLへ自動変換されます。infinity 以外にも存在しない日付の場合などでもNULL 値に変換されますためご注意ください。テストデータなどのNULL 値に変換されても業務影響が少ない場合など、ご利用をご検討ください。
replaceInvalidTypesWithNull=true;
B. カスタムクエリ内の CASE 式で任意の値に変換し取り込む
CDC ではない標準ジョブのみ可能な方法とはなりますが、各タスク内のカスタムクエリのSELECT 内で次のようなCASE 式を設定しinfinity の値を任意の日時に変換することができます。例えば以下のようにinfinity, -infinity 値を含むcreated_at カラムに対してそれぞれ'2999-12-31 23:59:59', '1900-01-01 00:00:00'に変換することが可能です。
REPLICATE [連携先テーブル名] ([created_at] TIMESTAMP)
SELECT
[~~その他のカラム~~],
CASE
WHEN [created_at] = 'infinity' THEN '2999-12-31 23:59:59'
WHEN [created_at] = '-infinity' THEN '1900-01-01 00:00:00'
ELSE [created_at]
END AS [created_at],
, [~~その他のカラム~~]
FROM [連携元スキーマ].[連携元テーブル名]
各タスクへ個別の設定とはなりますが、柔軟な値で取り込む必要がある場合などこちらの方法のご利用をご検討ください。
まとめ
本記事では、PostgreSQL の infinity 値を他のデータベースに連携するための方法について説明しました。PostgreSQL 連携やその他お困りのことがありましたら弊社テクニカルサポートまでお問い合わせくだ