EDIT: Я залишаю оригінальну прийняту відповідь такою, якою вона є, але зауважте, що подана нижче редакція, запропонована a_horse_with_no_name, є кращим методом створення тимчасової таблиці за допомогою VALUES.
Якщо ви просто хочете вибрати якесь значення, а не просто створити таблицю і вставити в неї, ви можете зробити щось на кшталт:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * FROM vals;
Щоб фактично створити тимчасову таблицю подібним чином, використовуйте:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * INTO temporary table temp_table FROM vals;
EDIT: Як вказував a_horse_with_no_name, у документах він зазначає, що CREATE TABLE AS...
він функціонально схожий SELECT INTO ...
, але що перший є надмножиною останнього і SELECT INTO
використовується в plpgslq для присвоєння значення тимчасовій змінній - тому він не зможе в той випадок. Тому, хоча наведені вище приклади справедливі для звичайного SQL, CREATE TABLE
слід віддати перевагу формі.
CREATE TEMP TABLE temp_table AS
WITH t (k, v) AS (
VALUES
(0::int,-99999::numeric),
(1::int,100::numeric)
)
SELECT * FROM t;
Зауважте, також із коментарів a_horse_with_no_name та в оригінальному питанні ОП це стосується переліку правильних типів даних усередині списку значень і використовує оператор CTE (WITH).
Крім того, як вказувалося у відповіді Евана Керрола, запит на CTE - це оптимізація , тобто CTE завжди матеріалізується. Існує багато вагомих причин для використання CTE, але це може бути досить вагомим результатом, якщо його не використовувати обережно. Однак є чимало випадків, коли огорожа для оптимізації може насправді підвищити продуктивність, тому це потрібно пам’ятати, а не сліпо уникати.