postgresql-9.2 – 将Oracle NVL移植到Postgres Coalesce失败
发布时间:2020-12-13 15:56:43 所属栏目:百科 来源:网络整理
导读:我正在将旧的Oracle代码移植到PostgreSQL 9.2.有几百个对Oracle NVL()的调用,所以我创建了映射函数来提供等效的功能.这个应该是微不足道的,但是由于对我来说根本不明显的原因而失败了. CREATE OR REPLACE FUNCTION nvl(expr1 text,expr2 text) RETURNS text
我正在将旧的Oracle代码移植到PostgreSQL 9.2.有几百个对Oracle NVL()的调用,所以我创建了映射函数来提供等效的功能.这个应该是微不足道的,但是由于对我来说根本不明显的原因而失败了.
CREATE OR REPLACE FUNCTION nvl(expr1 text,expr2 text) RETURNS text AS $BODY$ BEGIN RETURN COALESCE( expr1,expr2 ); END; $BODY$ LANGUAGE plpgsql STRICT IMMUTABLE; 我为不同的输入参数类型定义了NVL的变体,但是为了测试,我删除了除此之外的所有内容.我确定这个被调用,因为如果我删除它,我会得到一个未知的函数错误. 以下是此数据库上的几个查询结果,说明了该问题. # select nvl(null,'N/A'); nvl ----- (1 row) # select coalesce(nvl(null,'N/A'),'ITS STILL NULL???'); coalesce ------------------- ITS STILL NULL??? (1 row) 从上面可以看出,coalesce很好地独立工作,但不是我的功能. 我正在使用最新版本的PostgreSQL: # select version(); PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu,compiled by gcc (GCC) 4.4.7 20120 313 (Red Hat 4.4.7-3),64-bit 有线索吗? 解决方法
在可能的情况下,这些简单的函数应该用SQL语言实现.你可以获得更好的表现:
CREATE OR REPLACE FUNCTION nvl(expr1 text,expr2 text) RETURNS text AS $BODY$ SELECT coalesce($1,$2); $BODY$ LANGUAGE sql; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |