[pgsql-jp: 40064] postgreSQL 8.4.1 での自動キャストについて

skond66 @ mail.goo.ne.jp skond66 @ mail.goo.ne.jp
2009年 11月 20日 (金) 15:20:36 JST


お世話になっております。先日から、8.1系→8.4.1への移行を検討しておりますが、
キャストの処理で悩んでおります。


問題点1 charに対してintで where条件を書くとエラーとなる。

 character(8)のフィールドAに対し、select * from **** where A = 3;

 8.1はOK。8.4は下記のエラー。
 No operator matches the given name and argument type(s). 
 You might need to add explicit type casts
  
 これへの対応として、キャストを明示していくのはコード量的に大変なため、lets.postgresqlの
 ページを参照させていただき、
 (http://lets.postgresql.jp/documents/tutorial/cast/)

 CREATE CAST (int4 AS text) WITH FUNCTION int4text(int4) AS IMPLICIT;

 こちらを実行することで、問題点1は解決いたしました。しかし、これを行うと
 問題点2が発生するようになりました。


問題点2 || オペレータで 文字 と int が連結できない

 8.1および問題点1の解決策を行う前の8.4ですと、select 'name' || 13 は name13を
 返してくれますが、上記の解決策を行った後は下記のエラーとなります。

test=# SELECT 'name' || 13;
ERROR:  operator is not unique: unknown || integer
LINE 1: SELECT 'name' || 13;
                      ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts
.

 こちらも、SELECT 'name' || 13::text といったようにキャストをすればよいのですが、
 1よりは少ない数とはいえ、かなり大変であることと、この演算子 || だけの問題なのか
 どうか、判断しかねています。何かよい方法はないものでしょうか?



pgsql-jp メーリングリストの案内