281 votos

Declarar una variable en una consulta de PostgreSQL

¿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? Según 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?

262voto

fei0x Puntos 251

Logré el mismo objetivo utilizando una WITH cláusula, no es tan elegante pero puede hacer lo mismo. Aunque para este ejemplo es realmente excesivo. Tampoco recomiendo esto en particular.

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

147voto

No hay tal función en PostgreSQL. Solo puedes hacerlo en pl/PgSQL (u otros pl/*), pero no en SQL.

Una excepción es la consulta WITH () que puede funcionar como una variable, o incluso como un tuple de variables. Te permite devolver una tabla de valores temporales.

WITH master_user AS (
    SELECT
      login,
      fecha_de_registro
    FROM usuarios
    WHERE ...
)

SELECT *
FROM usuarios
WHERE login_maestro = (SELECT login
                      FROM master_user)
      AND (SELECT fecha_de_registro
           FROM master_user) > ...;

96voto

Dario Barrionuevo Puntos 455

También puedes intentar esto en PLPGSQL:

DO $$
DECLARE myvar integer;
BEGIN
    SELECT 5 INTO myvar;

    DROP TABLE IF EXISTS tmp_table;
    CREATE TEMPORARY TABLE tmp_table AS
    SELECT * FROM yourtable WHERE   id = myvar;
END $$;

SELECT * FROM tmp_table;

Lo anterior requiere Postgres 9.0 o posterior.

74voto

a_horse_with_no_name Puntos 100769

Configuración dinámica

puedes "abusar" de la configuración dinámica para esto:

-- elige un prefijo que es poco probable que sea utilizado por postgres
set session my.vars.id = '1';

select *
from person 
where id = current_setting('my.vars.id')::int;

Las configuraciones siempre son valores varchar, así que necesitas convertirlos al tipo de dato correcto al utilizarlos. Esto funciona con cualquier cliente SQL mientras que \set solo funciona en psql

Lo anterior requiere Postgres 9.2 o posterior.

Para versiones anteriores, la variable debía ser declarada en postgresql.conf antes de ser utilizada, lo que limitaba un poco su usabilidad. En realidad no la variable por completo, sino la "clase" de configuración que es esencialmente el prefijo. Pero una vez que el prefijo estaba definido, cualquier variable podía ser utilizada sin cambiar postgresql.conf

62voto

Shahriar Aghajani Puntos 101

Depende de tu cliente.

Sin embargo, si estás usando el cliente psql, entonces puedes usar lo siguiente:

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

Si estás utilizando variables de texto necesitas entrecomillar.

\set myvar 'valor_de_texto'
select * from sometable where name = :'myvar';

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X