sql >> Databáze >  >> RDS >> PostgreSQL

Jak otestovat můj ad-hoc SQL s parametry v okně dotazu Postgres

Různé možnosti.

Zadejte parametry v CTE, abyste měli "proměnné" v čistém SQL :

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

Toto funguje pro jakékoli dotazu.
Od CTE var obsahuje jeden řádek je bezpečné jej připojit pomocí CROSS JOIN na konci klauzule FROM - vlastně krátká forma s připojením za čárkou může být nejlepší, protože explicitní syntaxe spojení se váže před čárkami. Alias ​​doplňkové tabulky v je volitelný pro další zkrácení syntaxe.

NEBO levnější bez CTE. BTW, proč varchar(16) ? Stačí použít text :

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

Nebo použijte dočasnou tabulku hrát podobnou roli pro všechny dotazy v rámci stejné relace. Dočasné tabulky umírají s koncem relace.

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);
  • O dočasných tabulkách a autovacuum

Nebo můžete použít DO prohlášení jako @Houari dodaná nebo podobná zde:

  • PostgreSQL zacyklí vnější funkce. Je to možné?

Všimněte si, že nemůžete vrátit hodnoty z DO prohlášení. (Můžete použít RAISE ... ačkoli.) A nemůžete použít SELECT bez cíle v plpgsql - výchozí procedurální jazyk v DO prohlášení. Nahraďte SELECT s PERFORM zahodit výsledky.

Nebo můžete použít přizpůsobené možnosti , kterou můžete nastavit v postgresql.conf být viditelný globálně .

Nebo nastavit v relaci tak, aby byla viditelná po dobu trvání relace a pouze ve stejné relaci :

SET my.lastname = 'Troy';

Název proměnné musí obsahovat tečku. Jste omezeni na text jako datový typ tímto způsobem, ale jakýkoli datový typ může být reprezentován jako text ...

Můžete použít current_setting('my.lastname') jako vyjádření hodnoty. Cast, pokud potřebujete. Například:current_setting('my.json_var')::json ...

Nebo použijte SET LOCAL aby efekt trval pouze pro aktuální transakci . Viz:

  • Předávání ID uživatele spouštěčům PostgreSQL

Nebo můžete použít malý IMMUTABLE funkce jako globální trvalé proměnné, se kterými mohou manipulovat pouze privilegovaní uživatelé. Viz:

  • Existuje způsob, jak definovat pojmenovanou konstantu v dotazu PostgreSQL?

Nebo při práci s psql jako klientem použijte \set nebo \gset meta-příkazy a substituce proměnných.



  1. Co je databáze časových řad?

  2. sqlplus, jak najít podrobnosti o aktuálně připojené databázové relaci

  3. MariaDB JSON_CONTAINS() Vysvětleno

  4. Spuštění balíčku SSIS pomocí dtexec