EDYCJA: Pozostawiam oryginalną zaakceptowaną odpowiedź taką, jaka jest, ale pamiętaj, że poniższa edycja, sugerowana przez a_horse_w_no_name, jest preferowaną metodą tworzenia tabeli tymczasowej przy użyciu VALUES.
Jeśli chcesz tylko wybrać jedną z wartości, zamiast tworzyć tabelę i wstawiać do niej, możesz zrobić coś takiego:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * FROM vals;
Aby faktycznie utworzyć tymczasowy stół w podobny sposób, użyj:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * INTO temporary table temp_table FROM vals;
EDYCJA: Jak wskazano przez a_horse_with_no_name, w dokumentach stwierdza, że CREATE TABLE AS...
jest funkcjonalnie podobny SELECT INTO ...
, ale że ten pierwszy jest nadzbiorem drugiego i który SELECT INTO
jest używany w plpgslq do przypisywania wartości do zmiennej tymczasowej - więc nie powiodłaby się ta walizka. Dlatego, chociaż powyższe przykłady dotyczą zwykłego SQL, CREATE TABLE
forma powinna być preferowana.
CREATE TEMP TABLE temp_table AS
WITH t (k, v) AS (
VALUES
(0::int,-99999::numeric),
(1::int,100::numeric)
)
SELECT * FROM t;
Uwaga: również z komentarzy autorstwa_nazwa_nazwy_nazwa oraz w pierwotnym pytaniu PO, obejmuje to rzutowanie na prawidłowe typy danych na liście wartości i użycie instrukcji CTE (Z).
Ponadto, jak wskazano w odpowiedzi Evana Carrola, zapytanie CTE jest ogrodzeniem optymalizacyjnym , tj. CTE jest zawsze zmaterializowane. Istnieje wiele dobrych powodów, aby używać CTE, ale może być dość znaczący spadek wydajności, jeśli nie zostanie zastosowany ostrożnie. Istnieje jednak wiele przypadków, w których płot optymalizacyjny może rzeczywiście poprawić wydajność, więc należy o tym pamiętać, a nie ślepo unikać.