Wie Sie den anderen Antworten entnommen haben, verfügt PostgreSQL nicht über diesen Mechanismus in direktem SQL, obwohl Sie jetzt eine anonymer Block . Sie können jedoch etwas Ähnliches mit einem Common Table Expression (CTE) machen:
WITH vars AS (
SELECT 5 AS myvar
)
SELECT *
FROM somewhere,vars
WHERE something = vars.myvar;
Sie können natürlich so viele Variablen haben, wie Sie wollen, und sie können auch abgeleitet werden. Zum Beispiel:
WITH vars AS (
SELECT
'1980-01-01'::date AS start,
'1999-12-31'::date AS end,
(SELECT avg(height) FROM customers) AS avg_height
)
SELECT *
FROM customers,vars
WHERE (dob BETWEEN vars.start AND vars.end) AND height<vars.avg_height;
Der Prozess ist:
- Erzeugen Sie eine einzeilige Cte mit
SELECT
ohne eine Tabelle (in Oracle müssen Sie die FROM DUAL
).
- CROSS JOIN der cte mit der anderen Tabelle. Obwohl es eine
CROSS JOIN
Syntax ist die ältere Komma-Syntax etwas besser lesbar.
- Beachten Sie, dass ich die Daten gecastet habe, um mögliche Probleme in der Datenbank zu vermeiden.
SELECT
Klausel. Ich habe die kürzere Syntax von PostgreSQL verwendet, aber Sie hätten auch die formalere CAST('1980-01-01' AS date)
für dialektübergreifende Kompatibilität.
Normalerweise sollte man Cross-Joins vermeiden, aber da man nur eine einzige Zeile kreuzt, hat dies den Effekt, dass die Tabelle einfach um die variablen Daten erweitert wird.
In vielen Fällen ist es nicht erforderlich, die vars.
Präfix, wenn die Namen nicht mit den Namen in der anderen Tabelle kollidieren. Ich füge es hier ein, um den Punkt zu verdeutlichen.
Außerdem können Sie weitere CTEs hinzufügen.
Dies funktioniert auch in allen aktuellen Versionen von MSSQL und MySQL, die Variablen unterstützen, sowie in SQLite, das dies nicht tut, und in Oracle, das dies in gewisser Weise tut und in gewisser Weise nicht tut.
3 Stimmen
Es kann nur in PostgreSQL gemacht werden. Siehe die Antwort auf diese verwandte Frage: stackoverflow.com/questions/766657/
3 Stimmen
Diese verwandte Antwort hat bessere Antworten: stackoverflow.com/questions/13316773/