PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PL/pgSQL für dynamische All-in-One-Abfragen

Können Sie bitte einige Tabellendefinitionen und eine Beispielabfrage für das, was Sie versuchen, posten? Ich bin mir nicht 100 % sicher, wonach Sie suchen, aber es gibt ein paar Formen von "dynamischem" SQL, die gespeicherte Prozeduren/Funktionen verwenden:

  1. Erstellen Sie eine Funktion, die Eingabeparameter (z. B. categoryType, styleId, eventName, areaId) übernimmt, und fügen Sie diese Werte in eine "statische" SQL-Anforderung ein. Hier ist ein Beispiel für ein Abfrage-Snippet für Ihren Fall:

Hier ist ein echtes Beispiel:

CREATE OR REPLACE FUNCTION SP_IGLGetItem(
    pItemId INTEGER
) 
RETURNS TABLE(
    ItemId INTEGER,
    ItemName VARCHAR(100),
    ItemCategory CHAR(2) 
AS
$$
BEGIN
    RETURN QUERY
    SELECT i.ItemId, i.ItemName, i.ItemCategory
    FROM Item i
    WHERE (i.ItemId = pItemId OR pItemId IS NULL) -- Return single item (if specified, otherwise return all)
    ;
END;
$$
LANGUAGE 'plpgsql';
  1. Erstellen Sie eine Zeichenfolge, die die SQL enthält, die Sie dynamisch basierend auf verschiedenen Bedingungen, Parameterwerten usw. ausführen möchten. Dies ist so dynamisch wie möglich.

  2. Führen Sie bedingt verschiedene "statische" SQL-Anweisungen basierend auf den Werten Ihrer Eingabeparameter aus.

Passt irgendetwas davon zu Ihrer Situation?

PL/PGSQL ist nur die Sprache, die zum Schreiben gespeicherter Prozeduren/Funktionen in Postgres verwendet wird. Wenn Sie wirklich eine dynamische SQL-Generierung benötigen, schreiben Sie am besten eine Funktion mit PL/PGSQL.

Eine andere Möglichkeit besteht darin, das gewünschte SQL dynamisch in Ihrer Client-Anwendung zu generieren und dieses SQL dann direkt zur Ausführung zu übermitteln.