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.