Hallo Ich habe ein Problem, das erfordert, dass ich eine Auswahl in verschiedenen Spalten, basierend auf einer Bedingung. Ich kann dies in einem gespeicherten Prozess mit einer unreinen IF ELSIF-Klausel erreichen, aber ich würde gerne wissen, wie dies am besten gelöst werden kann. Hier ist ein Beispiel, um es deutlicher:Oracle PL/SQL - der beste Weg, um basierend auf einer Bedingung eine Auswahl, eine Gruppierung, eine Reihenfolge, eine Where-Klausel für verschiedene Spalten zu treffen?
PROCEDURE notSoSmartSelect(type IN VARCHAR, a_filter IN VARCHAR
, b_filter IN VARCHAR, results OUT SYS_REFCURSER) IS
BEGIN
IF type = 'A' THEN
OPEN results FOR
SELECT a, sum(val) v FROM sample_table
GROUP BY a, ORDER BY a;
ELSIF type = 'B' THEN
OPEN results FOR
SELECT b, a, sum(val) v FROM sample_table
WHERE a = a_filter
GROUP BY b, a, ORDER BY a, b;
ELSIF type = 'C' THEN
OPEN results FOR
SELECT c, b, a, sum(val) v FROM sample_table
WHERE a = a_filter AND b = b_filter
GROUP BY c, b, a, ORDER BY a, b, c;
END IF;
END;
Wie Sie bemerkt haben, in jedem Fall ist die verwendete Tabelle ist die gleiche, aber es gibt verschiedene Spalten verwendet werden, zu holen, Filter, Gruppen und Ordnung.
Der obige Code sieht ziemlich einfach aus, aber das eigentliche Problem hat viele Zweige und hat mehrere Wenn-sonst, was den Code sehr schmutzig macht. Gibt es eine elegante und saubere Art, sich diesem zu nähern? Vielleicht Dynamisches SQL? Aber ich kann nicht den besten Weg finden, um dynamische SQL dafür zu schreiben. Danke im Voraus.
Ich würde es lieber so machen, aber leider gibt es etwa eine halbe Million Datensätze ... und es dauert zu lange, um so viele auf einmal aus der Datenbank zu holen, während die Abfragen mit der Where-Klausel nur etwa 60 Datensätze zurückgeben . – Ocelot
Dann ist das leider der einzige Ansatz, über den ich nachdenken könnte –