写点什么

GaussDB(DWS) 条件表达式函数返回错误结果集排查

  • 2023-05-27
    广东
  • 本文字数:647 字

    阅读完需:约 2 分钟

GaussDB(DWS)条件表达式函数返回错误结果集排查

本文分享自华为云社区《GaussDB(DWS)条件表达式函数返回错误结果集排查》,作者:yd_211369925 。

(一)案例背景


客户使用 greatest 获取并返回参数列表中值最大的表达式的值,子查询中查询结果与将子查询的结果粘出来单独执行结果集不一致。


select greatest(1,2,100,-1,0,nvl(null,0)) --结果为2,select nvl(null,0)的结果为0select greatest(1,2,100,-1,0,0) --结果为100
复制代码

(二)问题排查


首先我们要了解 greatest 和 nvl 两个函数的用法




客户使用的版本为 dws820 环境为 mysql 兼容模式,nvl(null,0)结果类型为 unknown 的类型即为 text;



第一条 greatest(1,2,100,-1,0,nvl(null,0))参数中存在 int 和 text,即按字符排序 2 最大;


第二条 greatest(1,2,100,-1,0)参数均为 int,输出按数值排序 100 最大;


拓展:


对于一些非条件表达式函数可以通过\df+ 函数名(这里用 min 来举例) 查找入参和出参的数据类型



或者先使用 select proname,proisstrict,provolatile,prorettype,proargtypes,prosrc,proshippable from pg_proc where proname = '函数名';



再使用 select oid,typname from pg_type where oid =‘xxx’;(这里 oid 根据上述的 prorettype,proargtypes 来查询)



具体函数重要属性参考


GaussDB(DWS)函数下推属性介绍https://bbs.huaweicloud.com/blogs/250351

(三)解决方案


从上述排查中可知将,改写第一条语句,使用 nvl(null,0)::int 替换 nvl(null,0)使得 greatest 函数中所有数据类型均为 int 即可


SELECT greatest(1,2,100,-1,0,nvl(null,0)::int)
复制代码


此时结果是,100 符合客户预期结果。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
GaussDB(DWS)条件表达式函数返回错误结果集排查_数据库_华为云开发者联盟_InfoQ写作社区