4 つのパラメーターがあるという要件があります。p1、p2、p3、p4。ユーザーは、これらの単一または組み合わせのいずれかを入力できます。合計およびグループ化によって入力した列のみを表示したいです。他の列は除外する必要があります。これを行うにはどうすればよいですか?
3 に答える
このようなものがうまくいくかもしれません(あなたの質問は非常に曖昧であるため、100%確実ではありません)
SELECT
CASE WHEN :p1 = 0 THEN p1 ELSE NULL END AS p1,
CASE WHEN :p2 = 0 THEN p2 ELSE NULL END AS p2,
CASE WHEN :p3 = 0 THEN p3 ELSE NULL END AS p3,
CASE WHEN :p4 = 0 THEN p4 ELSE NULL END AS p4
FROM
yourTable
GROUP BY
CASE WHEN :p1 = 0 THEN p1 ELSE NULL END,
CASE WHEN :p2 = 0 THEN p2 ELSE NULL END,
CASE WHEN :p3 = 0 THEN p3 ELSE NULL END,
CASE WHEN :p4 = 0 THEN p4 ELSE NULL END
ただし、このタイプのクエリでは、SQL のパフォーマンスが非常に悪いことが多いことに注意してください。
固定クエリごとに、個別のプランがコンパイルされます。結果を生成するために使用されるアルゴリズムは、その時点で固定されます。パラメータが変更されても再コンパイルされません。
GROUP BY p1, p2
インデックスによっては、 を使用する場合とは根本的に異なる計画になる可能性があるため、これは重要ですGROUP BY p3, p4
。
そのため、多くの場合、コードで SQL ステートメントを再生成する方がパフォーマンスが大幅に向上します。
パラメーターを使用してどのフィールドを集計するかを SQL に指示するのではなく、パラメーターを使用してまったく新しい SQL ステートメントを記述し、代わりにその新しい SQL ステートメントを実行します。
mysql で group concat のようなものを使用したい場合、これが役立ち ます 複数の行を 1 つの行に集約する Oracle SQL クエリはありますか?
この問題は、動的 SQL を使用することで解決できます。動的 SQL では、最初に入力パラメーターに基づいて選択ステートメントを構築し、次に、EXECUTE IMMEDIATE などを使用してクエリを実行できます。動的 SQL の使用方法については、 Oracle のドキュメントを参照してください。