¿Cómo declaro una variable para usar en una consulta PostgreSQL 8.3?
En MS SQL Server puedo hacer esto:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
¿Cómo hago lo mismo en PostgreSQL? De acuerdo con la documentación, las variables se declaran simplemente como "tipo de nombre", pero esto me da un error de sintaxis:
myvar INTEGER;
¿Podría alguien darme un ejemplo de la sintaxis correcta?
Respuestas:
No existe tal característica en PostgreSQL. Puede hacerlo solo en pl / PgSQL (u otro pl / *), pero no en SQL simple.
Una excepción es la
WITH ()
consulta que puede funcionar como una variable, o inclusotuple
de variables. Le permite devolver una tabla de valores temporales.fuente
Logré el mismo objetivo usando una
WITH
cláusula , no es tan elegante pero puede hacer lo mismo. Aunque para este ejemplo es realmente exagerado. Tampoco lo recomiendo particularmente.fuente
\set
como se sugiere en la respuesta de Shahriar Aghajani.JOIN myconstants ON true
y luego no hay necesidad de hacer la sub-selección.WITH
CTE entre consultas en una transacción.WITH constants AS (SELECT 5 AS var) SELECT * FROM somewhere CROSS JOIN constants WHERE someting=var;
. CROSS JOIN, al ser una expresión de tabla de una sola fila, prácticamente duplica los datos de todas las filas de la tabla real y simplifica la expresión.También puedes probar esto en PLPGSQL:
Lo anterior requiere Postgres 9.0 o posterior.
fuente
Configuración de configuración dinámica
puede "abusar" de la configuración dinámica de configuración para esto:
Los ajustes de configuración siempre son valores varchar, por lo que debe convertirlos al tipo de datos correcto cuando los use. Esto funciona con cualquier cliente SQL, mientras que
\set
solo funciona enpsql
Lo anterior requiere Postgres 9.2 o posterior.
Para versiones anteriores, la variable tenía que declararse
postgresql.conf
antes de ser utilizada, por lo que limitaba un poco su usabilidad. En realidad no es la variable completamente, sino la "clase" de configuración, que es esencialmente el prefijo. Pero una vez que se definió el prefijo, cualquier variable podría usarse sin cambiarpostgresql.conf
fuente
set session my.vars.id = '1';
aset session my.user.id = '1';
rendiráERROR: syntax error at or near "user"
SET LOCAL ...
. Lasession
variable estará vigente mientras su conexión lo esté. Ellocal
alcance de la transacción.set session "my.user.id" = '1';
lacurrent_setting('my.user.id')
llamada funciona como se espera.Depende de tu cliente.
Sin embargo, si está utilizando el cliente psql , puede usar lo siguiente:
Si está utilizando variables de texto, necesita citar.
fuente
\set
debe estar en minúsculasdb=> \set someid 8292 db=> SELECT * FROM sometable WHERE id = :someid;
Usar una tabla temporal fuera de pl / PgSQL
Fuera de usar pl / pgsql u otro lenguaje pl / * como se sugiere, esta es la única otra posibilidad que se me ocurre.
fuente
Quiero proponer una mejora a la respuesta de @ DarioBarrionuevo , para simplificar el aprovechamiento de las tablas temporales.
fuente
1
(presumiblemente el recuento de filas) en lugar del contenido detmp_table
.Esta solución se basa en la propuesta por fei0x, pero tiene las ventajas de que no es necesario unir la lista de valores de las constantes en la consulta y las constantes se pueden enumerar fácilmente al comienzo de la consulta. También funciona en consultas recursivas.
Básicamente, cada constante es una tabla de un solo valor declarada en una cláusula WITH que luego se puede invocar en cualquier parte de la parte restante de la consulta.
Alternativamente, puede usar en
SELECT * FROM constant_name
lugar de loTABLE constant_name
que podría no ser válido para otros lenguajes de consulta diferentes a postgresql.fuente
Aquí hay un ejemplo usando las declaraciones PREPARE . Todavía no puede usar
?
, pero puede usar la$n
notación:fuente
Es cierto que no hay una forma vívida e inequívoca de declarar una variable de valor único, lo que puede hacer es
entonces, para obtener acceso al valor almacenado en esta construcción, debe
por ejemplo
fuente
Puede recurrir a funciones especiales de herramientas. Al igual que para la sintaxis propia de DBeaver:
fuente
En DBeaver puede usar parámetros en las consultas como puede hacerlo desde el código, por lo que esto funcionará:
Cuando ejecute la consulta, DBeaver le pedirá el valor de: myvar y ejecutará la consulta.
fuente