РЕДАКТИРОВАТЬ: я оставляю исходный принятый ответ, как есть, но, пожалуйста, обратите внимание, что редактирование ниже, как предложено 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;
РЕДАКТИРОВАТЬ: Как указано 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 и в исходном вопросе OP, он включает приведение к правильным типам данных в списке значений и использует оператор CTE (WITH).
Кроме того, как указывалось в ответе Эвана Кэррола, запрос CTE является забором оптимизации , т. Е. CTE всегда материализуется. Есть много веских причин для использования CTE, но может быть весьма значительное снижение производительности, если не использовать его осторожно. Однако во многих случаях барьер оптимизации может фактически повысить производительность, поэтому об этом следует помнить, а не слепо избегать.