EDIT: Estou deixando a resposta original aceita como está, mas observe que a edição abaixo, conforme sugerido por a_horse_with_no_name, é o método preferido para criar uma tabela temporária usando VALUES.
Se você deseja selecionar apenas alguns valores, em vez de apenas criar uma tabela e inseri-la, é possível fazer algo como:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * FROM vals;
Para realmente criar uma tabela temporária de maneira semelhante, use:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * INTO temporary table temp_table FROM vals;
EDIT: Como apontado por a_horse_with_no_name, nos documentos afirma que CREATE TABLE AS...
é funcionalmente semelhante a SELECT INTO ...
, mas que o primeiro é um superconjunto do último e que SELECT INTO
é usado no plpgslq para atribuir um valor a uma variável temporária - por isso falharia em Aquele caso. Portanto, enquanto os exemplos acima são válidos para SQL simples, o CREATE TABLE
formulário deve ser preferido.
CREATE TEMP TABLE temp_table AS
WITH t (k, v) AS (
VALUES
(0::int,-99999::numeric),
(1::int,100::numeric)
)
SELECT * FROM t;
Observe, também dos comentários de a_horse_with_no_name, e na pergunta original do OP, isso inclui uma conversão para os tipos de dados corretos na lista de valores e usa uma instrução CTE (WITH).
Além disso, como apontado na resposta de Evan Carrol, uma consulta CTE é uma cerca de otimização , ou seja, a CTE é sempre materializada. Há muitas boas razões para usar CTEs, mas pode haver um impacto significativo no desempenho, se não for usado com cuidado. Existem, no entanto, muitos casos em que a cerca de otimização pode realmente melhorar o desempenho; portanto, isso é algo que você deve estar ciente, para não evitar cegamente.