Hola, tenemos la respuesta a lo que estabas buscando, desplázate y la hallarás más abajo.
Solución:
EDITAR: Dejo la respuesta aceptada original tal como está, pero tenga en cuenta que la edición a continuación, como lo sugiere a_horse_with_no_name, es el método preferido para crear una tabla temporal usando VALORES.
Si solo desea seleccionar entre algunos valores, en lugar de simplemente crear una tabla e insertarla, puede hacer algo como:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * FROM vals;
Para crear una tabla temporal de manera similar, use:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * INTO temporary table temp_table FROM vals;
EDITAR: Como lo señaló a_horse_with_no_name, en los documentos establece que CREATE TABLE AS...
es funcionalmente similar a SELECT INTO ...
pero que el primero es un superconjunto del segundo y que SELECT INTO
se usa en plpgslq para asignar un valor a una variable temporal, por lo que fallaría en ese caso. Por lo tanto, mientras que los ejemplos anteriores son válidos para SQL simple, el CREATE TABLE
Se debe preferir la forma.
CREATE TEMP TABLE temp_table AS
WITH t (k, v) AS (
VALUES
(0::int,-99999::numeric),
(1::int,100::numeric)
)
SELECT * FROM t;
Tenga en cuenta, también de los comentarios de a_horse_with_no_name, y en la pregunta original del OP, esto incluye una conversión a los tipos de datos correctos dentro de la lista de valores y usa una declaración CTE (CON).
Además, como se señaló en la respuesta de Evan Carrol, en Postgres antes de la versión 12, una consulta CTE siempre es un valla de optimización, es decir, el CTE siempre se materializa. Hay muchas buenas razones para usar CTE, pero puede haber un impacto significativo en el rendimiento si no se usa con cuidado. Sin embargo, hay muchos casos en los que la valla de optimización puede mejorar el rendimiento, por lo que es algo que se debe tener en cuenta, no evitar ciegamente.
create table as
necesita una declaración de selección:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup
as
select *
from (
VALUES
(0::int,-99999::numeric),
(1::int, 100::numeric)
) as t (key, value);
También puede volver a escribir esto para usar un CTE:
create temp table lookup
as
with t (key, value) as (
values
(0::int,-99999::numeric),
(1::int,100::numeric)
)
select * from t;
El problema son los tipos de datos. Si los elimina, la declaración funcionará:
CREATE TEMP TABLE lookup
(key, val) AS
VALUES
(0, -99999),
(1, 100) ;
Puede definir los tipos emitiendo los valores de la primera fila:
CREATE TEMP TABLE lookup
(key, val) AS
VALUES
(0::bigint, -99999::int),
(1, 100) ;
Tienes la posibilidad difundir esta división si te fue útil.