要約: 条件式関数で結果セットの不一致が発生した場合、まず入力パラメータのデータ型の不一致が出力パラメータの不一致につながるかどうかを検討する必要があります。
この記事は、HUAWEI CLOUD コミュニティ「GaussDB (DWS) 条件式関数がエラー結果セットを返すトラブルシューティング」 (著者: yd_211369925) から共有されたものです。
(1) 事件の背景
顧客はパラメータ リスト内の最大値を持つ式の値を取得して返すために最大値を使用しますが、サブクエリ内のクエリ結果は、結果セットを突き出して個別に実行するサブクエリの結果と一致しません。
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
(2) トラブルシューティング
まず第一に、greater と nvl の 2 つの関数の使用法を理解する必要があります。
顧客が使用しているバージョンは dws820 で、環境は mysql 互換モードであり、nvl(null,0) の結果の型は不明であり、テキストです。
最初の great(1,2,100,-1,0,nvl(null,0)) パラメーターには int と text があります。つまり、文字による並べ替えが最も大きくなります。
2 番目に大きい (1,2,100,-1,0) のパラメーターはすべて int であり、出力は値 100 が最大である順に並べ替えられます。
拡大:
一部の非条件式関数では、 \df+ 関数名 (ここでは例として min を使用します) を使用して、入力パラメーターと出力パラメーターのデータ型を見つけることができます。
または、最初に pg_proc から select proname、proisstrict、provolatile、prorettype、proargtypes、prosrc、proshippable を使用します。ここで proname = '関数名';
次に、select oid, typname from pg_type where oid ='xxx'; を使用します (ここでは、oid は上記の prorettype、proargtypes に従ってクエリされます)
特定の機能の重要な属性の参照
GaussDB (DWS) 関数プッシュダウン属性の紹介
https://bbs.huaweicloud.com/blogs/250351
(3) 解決策
上記の調査から、最大の関数のすべてのデータ型が int になるように、最初のステートメントを書き直し、nvl(null, 0) を nvl(null,0)::int に置き換える必要があることがわかります。
SELECT greatest(1,2,100,-1,0,nvl(null,0)::int)
この時点での結果は、100 が顧客の期待結果を満たしています。
クリックしてフォローして、Huawei Cloudの最新テクノロジーについて初めて学びましょう~