sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan testes min ad-hoc SQL med parametre i Postgres forespørgselsvindue

Forskellige muligheder.

Angiv parametre i en CTE for at have "variabler" i ren SQL :

WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM   users, var v
WHERE  lastname = v.lastname;

Dette virker for alle forespørgsel.
Siden CTE var har en enkelt række det er sikkert at tilføje det med en CROSS JOIN i slutningen af ​​FROM-sætningen - faktisk er den korte form med tilføjelse efter et komma bedst, fordi eksplicit joinsyntaks binder før kommaer. Det ekstra tabelalias v er valgfrit for yderligere at forkorte syntaksen.

ELLER billigere uden CTE. BTW, hvorfor varchar(16) ? Brug bare text :

SELECT *
FROM   users
JOIN  (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE  lastname = var.lastname;

Eller brug en midlertidig tabel at spille en lignende rolle for alle forespørgsler inden for samme session. Temp-tabeller dør med slutningen af ​​sessionen.

CREATE TEMP TABLE var AS
SELECT text 'Troy' AS lastname;

ANALYZE var;  -- temp tables are not covered by autovacuum

SELECT * FROM users JOIN var USING (lastname);
  • Om midlertidige tabeller og autovacuum

Eller du kan bruge DO udsagn som @Houari leveret eller lignende demonstreret her:

  • PostgreSQL sløjfer eksterne funktioner. Er det muligt?

Bemærk, at du ikke kan returnere værdier fra DO udsagn. (Du kan bruge RAISE ... dog.) Og du kan ikke bruge SELECT uden mål i plpgsql - standardsprogsproget i en DO udmelding. Erstat SELECT med PERFORM at smide resultater væk.

Eller du kan bruge tilpassede muligheder , som du kan indstille i postgresql.conf at være synlig globalt .

Eller indstillet i din session til at være synlig i hele sessionens varighed og kun i samme session :

SET my.lastname = 'Troy';

Variabelnavnet skal inkludere en prik. Du er begrænset til text som datatype på denne måde, men enhver datatype kan repræsenteres som text ...

Du kan bruge current_setting('my.lastname') som værdiudtryk. Cast hvis du har brug for. For eksempel:current_setting('my.json_var')::json ...

Eller brug SET LOCAL for at effekten kun varer ved den aktuelle transaktion . Se:

  • Videregivelse af bruger-id til PostgreSQL-udløsere

Eller du kan bruge lille IMMUTABLE funktioner som global persisterede variabler, som kun privilegerede brugere kan manipulere. Se:

  • Er der en måde at definere en navngivet konstant i en PostgreSQL-forespørgsel?

Eller når du arbejder med psql som klient, skal du bruge \set eller \gset meta-kommandoer og variabel substitution.



  1. Oracle Unicode-spooling

  2. Oprettelse af en tabel ud fra en forespørgsel ved hjælp af et andet tablespace (Oracle SQL)

  3. En simpel brugssag for indekser på primære nøgler

  4. Kunsten at isolere afhængigheder og data i databaseenhedstestning