sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo probar mi SQL ad-hoc con parámetros en la ventana de consulta de Postgres

Varias opciones.

Proporcione parámetros en un CTE para tener "variables" en SQL puro :

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

Esto funciona para cualquier consulta.
Desde el CTE var tiene una fila única es seguro agregarlo con un CROSS JOIN al final de la cláusula FROM; en realidad, la forma abreviada que se agrega después de una coma puede ser mejor porque la sintaxis de unión explícita se une antes de las comas. El alias de tabla adicional v es opcional para acortar aún más la sintaxis.

O más barato sin CTE. Por cierto, ¿por qué varchar(16) ? Solo usa text :

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

O usa una mesa temporal desempeñar un papel similar para todos Consultas dentro de la misma sesión. Las tablas temporales mueren al final de la sesión.

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);
  • Acerca de las tablas temporales y autovacuum

O puedes usar DO declaraciones como @Houari provistas o como se demuestra aquí:

  • PostgreSQL realiza bucles fuera de las funciones. ¿Es eso posible?

Tenga en cuenta que no puede devolver valores de DO declaraciones. (Puede usar RAISE ... aunque.) Y no puedes usar SELECT sin destino en plpgsql:el lenguaje de procedimiento predeterminado en un DO declaración. Reemplazar SELECT con PERFORM tirar los resultados.

O puedes usar opciones personalizadas , que puede configurar en postgresql.conf ser visible globalmente .

O configurado en su sesión para que sea visible durante la duración de la sesión y solo en la misma sesión :

SET my.lastname = 'Troy';

El nombre de la variable debe incluir un punto. Estás limitado a text como tipo de datos de esta manera, pero cualquier tipo de datos se puede representar como text ...

Puede usar current_setting('my.lastname') como expresión de valor. Echa si lo necesitas. Por ejemplo:current_setting('my.json_var')::json ...

O use SET LOCAL para que el efecto dure solo para la transacción actual . Ver:

  • Pasar la identificación de usuario a los activadores de PostgreSQL

O puedes usar tiny IMMUTABLE funciones como global variables persistentes que solo los usuarios privilegiados pueden manipular. Ver:

  • ¿Hay alguna forma de definir una constante con nombre en una consulta de PostgreSQL?

O cuando trabaje con psql como cliente, use \set o \gset metacomandos y sustitución de variables.