Jak zadeklarować zmienną do użycia w zapytaniu PostgreSQL 8.3?
W MS SQL Server mogę to zrobić:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
Jak zrobić to samo w PostgreSQL? Zgodnie z dokumentacją zmienne są zadeklarowane po prostu jako „typ nazwy”, ale daje mi to błąd składniowy:
myvar INTEGER;
Czy ktoś mógłby mi podać przykład poprawnej składni?
Odpowiedzi:
W PostgreSQL nie ma takiej funkcji. Możesz to zrobić tylko w pl / PgSQL (lub innym pl / *), ale nie w zwykłym SQL.
Wyjątkiem jest
WITH ()
zapytanie, które może działać jako zmienna, a nawettuple
zmienne. Pozwala zwrócić tabelę wartości tymczasowych.źródło
Osiągnąłem ten sam cel, używając
WITH
klauzuli , nie jest to tak eleganckie, ale może zrobić to samo. Chociaż w tym przykładzie jest to naprawdę przesada. Też nie polecam tego szczególnie.źródło
\set
zgodnie z sugestią Shahriara Aghajaniego.JOIN myconstants ON true
a potem nie ma potrzeby wykonywania wyboru dodatkowego.WITH
CTE między zapytaniami w transakcji.WITH constants AS (SELECT 5 AS var) SELECT * FROM somewhere CROSS JOIN constants WHERE someting=var;
. CROSS JOIN, będąc wyrażeniem tabeli z jednym wierszem, wirtualnie powiela dane dla wszystkich wierszy w prawdziwej tabeli i upraszcza wyrażenie.Możesz także spróbować tego w PLPGSQL:
Powyższe wymaga Postgres 9.0 lub nowszego.
źródło
Ustawienia dynamicznej konfiguracji
możesz „nadużyć” ustawień dynamicznej konfiguracji w tym celu:
Ustawienia konfiguracji są zawsze wartościami varchar, więc podczas ich używania musisz rzutować je na poprawny typ danych. Działa to z każdym klientem SQL, podczas gdy
\set
działa tylko wpsql
Powyższe wymaga Postgres 9.2 lub nowszego.
W poprzednich wersjach zmienną trzeba było zadeklarować w
postgresql.conf
przed użyciem, więc ograniczyła nieco jej użyteczność. W rzeczywistości nie jest to zmienna całkowicie, ale konfiguracyjna „klasa”, która jest zasadniczo przedrostkiem. Ale po zdefiniowaniu prefiksu można użyć dowolnej zmiennej bez zmianypostgresql.conf
źródło
set session my.vars.id = '1';
naset session my.user.id = '1';
przyniesieERROR: syntax error at or near "user"
SET LOCAL ...
.session
Zmienna będzie obowiązywać tak długo, jak połączenie jest. Zakreslocal
obejmuje transakcje.set session "my.user.id" = '1';
current_setting('my.user.id')
To zależy od twojego klienta.
Jeśli jednak używasz klienta psql , możesz użyć następujących opcji:
Jeśli używasz zmiennych tekstowych, musisz zacytować.
źródło
\set
muszą byćdb=> \set someid 8292 db=> SELECT * FROM sometable WHERE id = :someid;
Używanie tabeli temperatur poza pl / PgSQL
Poza użyciem sugerowanego języka pl / pgsql lub innego języka pl / *, jest to jedyna inna możliwość, o której mogłem pomyśleć.
źródło
Chcę zaproponować ulepszenie odpowiedzi @ DarioBarrionuevo , aby ułatwić korzystanie z tabel tymczasowych.
źródło
1
(prawdopodobnie liczbę wierszy), a nie zawartośćtmp_table
.To rozwiązanie jest oparte na rozwiązaniu zaproponowanym przez fei0x, ale ma tę zaletę, że nie ma potrzeby dołączania do listy wartości stałych w zapytaniu, a stałe można łatwo wymienić na początku zapytania. Działa również w zapytaniach rekurencyjnych.
Zasadniczo każda stała jest tabelą pojedynczej wartości zadeklarowaną w klauzuli WITH, którą można następnie wywołać w dowolnym miejscu w pozostałej części zapytania.
Alternatywnie możesz użyć
SELECT * FROM constant_name
zamiast tego,TABLE constant_name
który może być niepoprawny dla innych języków zapytań innych niż postgresql.źródło
Oto przykład z użyciem instrukcji PREPARE . Nadal nie możesz używać
?
, ale możesz używać$n
notacji:źródło
To prawda, że nie ma wyraźnego i jednoznacznego sposobu zadeklarowania zmiennej o jednej wartości, co możesz zrobić
następnie, aby uzyskać dostęp do wartości przechowywanej w tej konstrukcji, robisz to
na przykład
źródło
Możesz skorzystać z funkcji specjalnych narzędzi. Podobnie jak w przypadku własnej własności składni DBeaver:
źródło
W DBeaver możesz używać parametrów w zapytaniach, tak jak możesz to zrobić z kodu, więc to zadziała:
Po uruchomieniu zapytania DBeaver zapyta o wartość: myvar i uruchom zapytanie.
źródło