variable una resultado query procedimientos funciones español declarar consultas asignar almacenados sql postgresql postgresql-8.3

una - manual de postgresql 10 en español pdf



Cómo declarar una variable en una consulta de PostgreSQL (8)

¿Cómo declaro una variable para usar en una consulta de 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 "nombre tipo;", pero esto me da un error de sintaxis:

myvar INTEGER;

¿Podría alguien darme un ejemplo de la sintaxis correcta?


Configuración de configuración dinámica

puedes "abusar" de las configuraciones dinámicas de configuración para esto:

-- choose some prefix that is unlikey to be used by postgres set session my.vars.id = ''1''; select * from person where id = current_setting(''my.vars.id'')::int;

Los ajustes de configuración son siempre 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 en psql

Lo anterior requiere Postgres 9.2 o posterior.

Para las versiones anteriores, la variable tenía que declararse en postgresql.conf antes de ser utilizada, por lo que limitaba su usabilidad de alguna manera. En realidad, no es la variable por completo, 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 cambiar postgresql.conf


Usar una tabla de temperatura fuera de pl / PgSQL

Aparte de usar pl / pgsql u otro lenguaje pl / * como se sugiere, esta es la única otra posibilidad que se me ocurre.

begin; select 5::int as var into temp table myvar; select * from somewhere s, myvar v where s.something = v.var; commit;


Aquí hay un ejemplo usando las instrucciones PREPARE . Todavía no puedes usar ? , pero puedes usar la notación $n :

PREPARE foo(integer) AS SELECT * FROM somewhere WHERE something = $1; EXECUTE foo(5); DEALLOCATE foo;


Depende de tu cliente

Sin embargo, si está utilizando el cliente psql , puede usar lo siguiente:

my_db=> /set myvar 5 my_db=> SELECT :myvar + 1 AS my_var_plus_1; my_var_plus_1 --------------- 6


Logré el mismo objetivo al usar una cláusula WITH , no es ni de lejos tan elegante, pero puedo hacer lo mismo. Aunque para este ejemplo es realmente excesivo. Yo tampoco lo recomiendo particularmente.

WITH myconstants (var1, var2) as ( values (5, ''foo'') ) SELECT * FROM somewhere, myconstants WHERE something = var1 OR something_else = var2;


No existe tal característica en PostgreSQL. Puede hacerlo solo en pl / PgSQL (u otro pl / *), pero no en SQL simple.


Quiero proponer una mejora a la respuesta de @DarioBarrionuevo , para simplificar el aprovechamiento de tablas temporales.

DO $$ DECLARE myvar integer = 5; BEGIN CREATE TEMP TABLE tmp_table ON COMMIT DROP AS -- put here your query with variables: SELECT * FROM yourtable WHERE id = myvar; END $$; SELECT * FROM tmp_table;


También puedes probar esto en PLPGSQL:

DO $$ DECLARE myvar integer; BEGIN SELECT 5 INTO myvar; DROP TABLE IF EXISTS tmp_table; CREATE TABLE tmp_table AS SELECT * FROM yourtable WHERE id = myvar; END $$; SELECT * FROM tmp_table;

Lo anterior requiere Postgres 9.0 o posterior.