摘要:條件表達式函數中出現結果集不一致問題,我們首先要考慮是否入參數據類型不一致導致出參不一致。 本文分享自華為雲社區《GaussDB(DWS)條件表達式函數返回錯誤結果集排查》,作者:yd_211369925 。 (一)案例背景 客戶使用greatest獲取並返回參數列表中值最大的表達式的值,子查 ...
摘要:條件表達式函數中出現結果集不一致問題,我們首先要考慮是否入參數據類型不一致導致出參不一致。
本文分享自華為雲社區《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符合客戶預期結果。