sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man testar min ad-hoc SQL med parametrar i Postgres frågefönster

Olika alternativ.

Ange parametrar i en CTE för att ha "variabler" i ren SQL :

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

Detta fungerar för alla fråga.
Sedan CTE var har en en rad det är säkert att lägga till den med en CROSS JOIN i slutet av FROM-satsen - faktiskt den korta formen med att lägga till den efter ett kommatecken kan vara bäst eftersom explicit join-syntax binder före kommatecken. Tilläggstabellaliaset v är valfritt för att ytterligare förkorta syntaxen.

ELLER billigare utan CTE. BTW, varför varchar(16) ? Använd bara text :

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

Eller använd en tillfällig tabell att spela en liknande roll för alla frågor inom samma session. Temp-tabeller dör i slutet av 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 tillfälliga tabeller och autovacuum

Eller du kan använda DO uttalanden som @Houari tillhandahåller eller liknande visas här:

  • PostgreSQL loopar externa funktioner. Är det möjligt?

Observera att du inte kan returnera värden från DO uttalanden. (Du kan använda RAISE ... dock.) Och du kan inte använda SELECT utan mål i plpgsql - standardprocedurspråket i en DO påstående. Ersätt SELECT med PERFORM att kasta bort resultat.

Eller du kan använda anpassade alternativ , som du kan ställa in i postgresql.conf att vara synlig globalt .

Eller ställ in i din session för att vara synlig under sessionens varaktighet och endast i samma session :

SET my.lastname = 'Troy';

Variabelnamnet måste inkludera en prick. Du är begränsad till text som datatyp på detta sätt, men vilken datatyp som helst kan representeras som text ...

Du kan använda current_setting('my.lastname') som värdeuttryck. Kasta om du behöver. Till exempel:current_setting('my.json_var')::json ...

Eller använd SET LOCAL för att effekten bara ska vara för den aktuella transaktionen . Se:

  • Överför användar-id till PostgreSQL-utlösare

Eller du kan använda små IMMUTABLE funktioner som global bestående variabler som endast privilegierade användare kan manipulera. Se:

  • Finns det något sätt att definiera en namngiven konstant i en PostgreSQL-fråga?

Eller när du arbetar med psql som klient, använd \set eller \gset meta-kommandon och variabelsubstitution.



  1. Hur man lägger till tid till ett Datetime-värde i MySQL

  2. Java JDBC MySQL-undantag:Operation inte tillåten efter att ResultSet stängts

  3. Verifiera databasanslutning med pg-promise när du startar en app

  4. Felsökning av SQL Server Transactional Replikeringsproblem