[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 メーリングリストの案内