465 Stimmen

Wie man eine Variable in einer PostgreSQL-Abfrage deklariert

Wie deklariere ich eine Variable zur Verwendung in einer PostgreSQL 8.3-Abfrage?

In MS SQL Server kann ich dies tun:

DECLARE @myvar INT
SET @myvar = 5

SELECT *
FROM somewhere
WHERE something = @myvar

Wie kann ich dasselbe in PostgreSQL tun? Laut der Dokumentation werden Variablen einfach als "name type;" deklariert, aber das gibt mir einen Syntaxfehler:

myvar INTEGER;

Kann mir jemand ein Beispiel für die richtige Syntax geben?

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/

410voto

fei0x Punkte 3669

Das gleiche Ziel habe ich mit einer WITH Klausel Es ist bei weitem nicht so elegant, kann aber dasselbe leisten. Obwohl für dieses Beispiel ist es wirklich Overkill. Ich empfehle dies auch nicht besonders.

WITH myconstants (var1, var2) as (
   values (5, 'foo')
)
SELECT *
FROM somewhere, myconstants
WHERE something = var1
   OR something_else = var2;

212voto

In PostgreSQL gibt es eine solche Funktion nicht. Sie können dies nur in pl/PgSQL (oder anderen pl/*) tun, aber nicht in einfachem SQL.

Eine Ausnahme ist WITH () Abfrage, die als Variable arbeiten kann, oder sogar tuple von Variablen. Sie ermöglicht die Rückgabe einer Tabelle mit temporären Werten.

WITH master_user AS (
    SELECT
      login,
      registration_date
    FROM users
    WHERE ...
)

SELECT *
FROM users
WHERE master_login = (SELECT login
                      FROM master_user)
      AND (SELECT registration_date
           FROM master_user) > ...;

157voto

Dario Barrionuevo Punkte 2677

Sie können dies auch in PLPGSQL versuchen:

DO $$
DECLARE myvar integer;
BEGIN
    SELECT 5 INTO myvar;

    DROP TABLE IF EXISTS tmp_table;
    CREATE TABLE tmp_table AS
    SELECT * FROM yourtable WHERE   id = myvar;
END $$;

SELECT * FROM tmp_table;

Die obigen Ausführungen erfordern Postgres 9.0 oder höher.

112voto

a_horse_with_no_name Punkte 489934

Dynamische Konfig-Einstellungen

Sie können die dynamischen Konfigurationseinstellungen dafür "missbrauchen":

-- choose some prefix that is unlikely to be used by postgres
set session my.vars.id = '1';

select *
from person 
where id = current_setting('my.vars.id')::int;

Konfigurationseinstellungen sind immer varchar-Werte, so dass Sie sie in den richtigen Datentyp umwandeln müssen, wenn Sie sie verwenden. Dies funktioniert mit jedem SQL-Client, während \set funktioniert nur in psql

Die obigen Ausführungen erfordern Postgres 9.2 oder höher.

In früheren Versionen musste die Variable in postgresql.conf vor ihrer Verwendung, was ihre Verwendbarkeit etwas einschränkte. Eigentlich nicht die Variable selbst, sondern die Konfigurations-"Klasse", die im Wesentlichen das Präfix ist. Aber sobald das Präfix definiert war, konnte jede Variable verwendet werden, ohne dass die postgresql.conf

83voto

Shahriar Aghajani Punkte 691

Das hängt von Ihrem Kunden ab.

Wenn Sie jedoch die psql Client, dann können Sie Folgendes verwenden:

my_db=> \set myvar 5
my_db=> SELECT :myvar  + 1 AS my_var_plus_1;
 my_var_plus_1 
---------------
             6

Wenn Sie Textvariablen verwenden, müssen Sie diese in Anführungszeichen setzen.

\set myvar 'sometextvalue'
select * from sometable where name = :'myvar';

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X