sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik mijn ad-hoc SQL testen met parameters in het Postgres-queryvenster?

Verschillende opties.

Geef parameters op in een CTE om "variabelen" te hebben in pure SQL :

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

Dit werkt voor elke query.
Sinds de CTE var heeft een enkele rij het is veilig om het toe te voegen met een CROSS JOIN aan het einde van de FROM-clausule - eigenlijk is de korte vorm met het toevoegen ervan na een komma misschien het beste omdat expliciete join-syntaxis bindt vóór komma's. De extra tabelalias v is optioneel om de syntaxis verder in te korten.

OF goedkoper zonder CTE. Trouwens, waarom varchar(16) ? Gebruik gewoon text :

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

Of gebruik een tijdelijke tabel om een ​​vergelijkbare rol te spelen voor allen vragen binnen dezelfde sessie. Tijdelijke tafels sterven aan het einde van de sessie.

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);
  • Over tijdelijke tabellen en autovacuum

Of je kunt DO . gebruiken uitspraken zoals @Houari geleverd of zoals hier gedemonstreerd:

  • PostgreSQL maakt een loop buiten functies. Is dat mogelijk?

Merk op dat u geen waarden kunt retourneren van DO verklaringen. (U kunt RAISE ... gebruiken hoewel.) En je kunt SELECT . niet gebruiken zonder doel in plpgsql - de standaard proceduretaal in een DO uitspraak. Vervang SELECT met PERFORM om resultaten weg te gooien.

Of u kunt aangepaste opties gebruiken , die u kunt instellen in postgresql.conf zichtbaar zijn wereldwijd .

Of ingesteld in uw sessie om zichtbaar te zijn voor de duur van de sessie en alleen in dezelfde sessie :

SET my.lastname = 'Troy';

De variabelenaam moet een punt invoegen. Je bent beperkt tot text op deze manier als gegevenstype, maar elk gegevenstype kan worden weergegeven als text ...

U kunt current_setting('my.lastname') . gebruiken als waarde-uitdrukking. Cast als je nodig hebt. Bijvoorbeeld:current_setting('my.json_var')::json ...

Of gebruik SET LOCAL zodat het effect alleen geldt voor de huidige transactie . Zie:

  • Gebruikers-ID doorgeven aan PostgreSQL-triggers

Of je kunt het kleine IMMUTABLE . gebruiken functies als algemeen persistente variabelen die alleen bevoorrechte gebruikers kunnen manipuleren. Zie:

  • Is er een manier om een ​​benoemde constante in een PostgreSQL-query te definiëren?

Of wanneer u met psql als client werkt, gebruikt u de \set of \gset meta-commando's en variabele vervanging.



  1. Hoe SHOW COLLATION werkt in MariaDB

  2. Meer informatie over machtigingen op MySQL-tabelniveau

  3. PyInstaller, spec-bestand, ImportError:Geen module met de naam 'blah'

  4. 12.2 RAC/GI Nieuwe functies