EDIT: Lascio la risposta originale accettata così com'è, ma tieni presente che la modifica di seguito, come suggerito da a_horse_with_no_name, è il metodo preferito per creare una tabella temporanea usando VALUES.
Se vuoi solo selezionare alcuni valori, anziché creare una tabella e inserirla in essa, puoi fare qualcosa del tipo:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * FROM vals;
Per creare effettivamente una tabella temporanea in modo simile, utilizzare:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * INTO temporary table temp_table FROM vals;
EDIT: Come sottolineato da a_horse_with_no_name, nei documenti afferma che CREATE TABLE AS...
è funzionalmente simile a SELECT INTO ...
, ma che il primo è un superset di quest'ultimo e che SELECT INTO
viene utilizzato in plpgslq per assegnare un valore a una variabile temporanea - quindi fallirebbe questo caso. Pertanto, mentre gli esempi sopra riportati sono validi per SQL semplice, il CREATE TABLE
modulo dovrebbe essere preferito.
CREATE TEMP TABLE temp_table AS
WITH t (k, v) AS (
VALUES
(0::int,-99999::numeric),
(1::int,100::numeric)
)
SELECT * FROM t;
Si noti, anche dai commenti di a_horse_with_no_name, e nella domanda originale dell'OP, questo include un cast ai tipi di dati corretti all'interno dell'elenco dei valori e utilizza un'istruzione CTE (WITH).
Inoltre, come sottolineato nella risposta di Evan Carrol, una query CTE è una barriera di ottimizzazione , ovvero la CTE viene sempre materializzata. Ci sono molte buone ragioni per usare i CTE, ma può esserci un notevole calo delle prestazioni, se non usato con attenzione. Vi sono, tuttavia, molti casi in cui il recinto di ottimizzazione può effettivamente migliorare le prestazioni, quindi questo è qualcosa di cui essere consapevoli, da non evitare alla cieca.