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.