摘要:條件運算式函式中出現結果集不一致問題,我們首先要考慮是否入參資料型別不一致導致出參不一致,
本文分享自華為云社區《GaussDB(DWS)條件運算式函式回傳錯誤結果集排查》,作者:yd_211369925 ,
(一)案例背景
客戶使用greatest獲取并回傳引數串列中值最大的運算式的值,子查詢中查詢結果與將子查詢的結果粘出來單獨執行結果集不一致,
select greatest(1,2,100,-1,0,nvl(null,0)) --結果為2,select nvl(null,0)的結果為0 select 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符合客戶預期結果,
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/553613.html
標籤:其他
上一篇:GaussDB(DWS)條件運算式函式回傳錯誤結果集排查
下一篇:返回列表
