犬ターネット

operator does not exist: character varying = integer

2012-03-29 postgresql

postgresql を 8.1 → 8.4 に上げて動作確認してたら以下みたいなエラーが出た。

db=# SELECT * FROM unko WHERE unko_type=1;
ERROR: operator does not exist: character varying = integer at character xx
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
LINE 1: ...unko WHERE unko_type=1;

ちょっと調べたら、postgresql 8.3 から型変換チェックが厳密になって暗黙のキャストが行われなくなったためだった。

本来は以下みたいにSQLを直すべきなんだけど、

SELECT * FROM unko WHERE unko_type=1;
↓
SELECT * FROM unko WHERE unko_type='1';

今回は時間がなかったのと、業務で使わない環境だから、CREATE CAST 構文の INOUT属性を使ってお茶を濁した。

CREATE cast (int4 as text) with inout as implicit;
参考:キャストを追加してバージョン互換性を保つには — Let's Postgres

Chrome の autocomplete のやつ

結婚記念日