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

Itagaki Takahiro itagaki.takahiro @ oss.ntt.co.jp
2009年 11月 24日 (火) 09:17:19 JST


skond66 @ mail.goo.ne.jp wrote:

> 問題点1 charに対してintで where条件を書くとエラーとなる。
>  character(8)のフィールドAに対し、select * from **** where A = 3;

>  (http://lets.postgresql.jp/documents/tutorial/cast/)
>  CREATE CAST (int4 AS text) WITH FUNCTION int4text(int4) AS IMPLICIT;

上記ページにもありますが、8.4 ならば
    CREATE CAST (int4 AS text) WITH INOUT AS IMPLICIT;
のほうがおすすめです。

> 問題点2 || オペレータで 文字 と int が連結できない
> 
>  8.1および問題点1の解決策を行う前の8.4ですと、select 'name' || 13 は name13を
>  返してくれますが、上記の解決策を行った後は下記のエラーとなります。
> HINT:  Could not choose a best candidate operator. You might need to add explicit type casts

ソースの修正が難しければ、|| 演算子も「text || int4」版を追加するのが
一番手間が無いかと思います。また、上記のキャストの別解として、
これと同様「text = int4」の比較演算子を追加するという手もあります。

=# CREATE FUNCTION textint4cat(text, int4) RETURNS text
   AS 'SELECT $1 || $2::pg_catalog.text' LANGUAGE sql IMMUTABLE STRICT;
=# CREATE OPERATOR || (PROCEDURE = textint4cat, LEFTARG = text, RIGHTARG = int4);
=# SELECT 'name' || 13;
 ?column?
----------
 name13
(1 行)

上で行っていることの技術的な背景は、下記のクエリを参考にしてください。

SELECT oprleft::regtype, oprright::regtype, oprcode, lanname, prosrc
  FROM pg_operator, pg_proc p, pg_language l
 WHERE oprname = '||' AND oprcode = p.oid AND l.oid = prolang
 ORDER BY oprleft, oprright;

------------------------------------------------------------
NTT オープンソース ソフトウェア センタ
板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>





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