免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10691 | 回复: 4

postgreSQL9 如何隐式类型转换 [复制链接]

论坛徽章:
0
发表于 2012-12-17 20:50 |显示全部楼层
据说自8.3之后去掉了该特性,不知道是否可以通过什么功能能达到该效果。

即不需要修改sql,之前的老sql能继续使用。

例如:
SELECT  *  from TRIGGERS WHERE ISVOLATILE = 1;

ISVOLATILE 为 varchar类型,这条语句在9里面报下面错误:
operator不存在: character varying = integer
第1行..._NAME, TRIGGER_GROUP FROM jk_TRIGGERS WHERE IS_VOLATILE = 0;
                                                                ^
提示:  沒有符合指定之名稱和參數型別的運算子。您可能需要加入明確型別轉換。

谢谢!

论坛徽章:
0
发表于 2012-12-27 11:00 |显示全部楼层
看来9还反而严格了..

论坛徽章:
0
发表于 2013-01-17 09:39 |显示全部楼层
postgres=# create table t (id varchar);
CREATE TABLE
postgres=# insert into t values ('1');
INSERT 0 1
postgres=# CREATE FUNCTION varcharinteq(varchar,int) RETURNS boolean
postgres-#     AS $$ SELECT $1=$2::varchar $$
postgres-#     LANGUAGE SQL;
CREATE FUNCTION
postgres=# create operator = (procedure=varcharinteq,LEFTARG='varchar',RIGHTARG='int4');
CREATE OPERATOR
postgres=# select * from t where id=1;
id
----
1
(1 row)

postgres=# CREATE FUNCTION intvarchareq(int,varchar) RETURNS boolean
    AS $$ SELECT $1::varchar=$2 $$         
    LANGUAGE SQL;
CREATE FUNCTION
postgres=# create operator = (procedure=intvarchareq,LEFTARG='int4',RIGHTARG='varchar');
CREATE OPERATOR
postgres=# select * from t where 1=id;
id
----
1
(1 row)

论坛徽章:
0
发表于 2013-02-22 13:39 |显示全部楼层
回复 3# digoal


    多谢,看来相当复杂

论坛徽章:
0
发表于 2014-04-23 15:55 |显示全部楼层
根据2楼的回复写了以下两个运算符,但是会覆盖掉原有正常的运算符不知道怎样弄呢?
CREATE FUNCTION int_varchar_req(int4,varchar) RETURNS boolean
AS $$ SELECT $1::varchar=$2 $$
LANGUAGE SQL;
create operator = (procedure=int_varchar_req,LEFTARG='int4',RIGHTARG='varchar');

CREATE FUNCTION varchar_int_req(varchar,int4) RETURNS boolean
AS $$ SELECT $1=$2::VARCHAR $$
LANGUAGE SQL;
create operator = (procedure=varchar_int_req,LEFTARG='varchar',RIGHTARG='int4');

表结构 t_user (user_id{varchar},user_name{varchar})
insert into t_user values('123','test');
1、select * from t_user where user_id= 123
2、select * from t_user where 123=user_id
3、select * from t_user where user_id=‘132a’
4、select * from t_user where user_name=‘test’
1、2运行时OK的
3、4运行的时候就会报错:[Err] ERROR: invalid input syntax for integer: "test"
where user_name=‘test’
大神,您是怎样结局的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP