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

skond66 @ mail.goo.ne.jp skond66 @ mail.goo.ne.jp
2009年 11月 24日 (火) 13:47:54 JST


ありがとうございます。教えて頂いたCREATE OPERATORを使用して問題に対応することが
できました。今後もよろしくお願いいたします。



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

申し訳ありません。私の転記ミスです。上記のおすすめSQLを使用しております。



----- Original Message ----- 
送信者: Itagaki Takahiro<itagaki.takahiro @ oss.ntt.co.jp>
宛先: pgsql-jp @ ml.postgresql.jp
日付:Tuesday, November, 24, 2009, 09:17 AM
件名: [pgsql-jp: 40066] Re:postgreSQL 8.4.1 での自動キャストについて

> 
> 
> 
> 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 c
asts
> 
> ソースの修正が難しければ、|| 演算子も「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 メーリングリストの案内