BEARBEITEN: Ich lasse die ursprünglich akzeptierte Antwort unverändert, beachte jedoch, dass die folgende Bearbeitung, wie von a_horse_with_no_name vorgeschlagen, die bevorzugte Methode zum Erstellen einer temporären Tabelle mit VALUES ist.
Wenn Sie nur aus einigen Werten auswählen möchten, anstatt nur eine Tabelle zu erstellen und in diese einzufügen, können Sie Folgendes tun:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * FROM vals;
Um eine temporäre Tabelle auf ähnliche Weise zu erstellen, verwenden Sie:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * INTO temporary table temp_table FROM vals;
BEARBEITEN: Wie in a_horse_with_no_name ausgeführt, wird in den Dokumenten angegeben , dass dies CREATE TABLE AS...
funktional ähnlich SELECT INTO ...
ist, dass jedoch erstere eine Obermenge der letzteren SELECT INTO
ist und in plpgslq zum Zuweisen eines Werts zu einer temporären Variablen verwendet wird - dies würde fehlschlagen dieser Fall. Während die obigen Beispiele für einfaches SQL gültig sind, CREATE TABLE
sollte daher die Form bevorzugt werden.
CREATE TEMP TABLE temp_table AS
WITH t (k, v) AS (
VALUES
(0::int,-99999::numeric),
(1::int,100::numeric)
)
SELECT * FROM t;
Beachten Sie auch, dass in den Kommentaren von a_horse_with_no_name und in der ursprünglichen Frage des OP eine Umwandlung in die richtigen Datentypen in der Werteliste enthalten ist und eine CTE (WITH) -Anweisung verwendet wird.
Wie in der Antwort von Evan Carrol ausgeführt, ist eine CTE-Abfrage auch ein Optimierungsbereich , dh, der CTE wird immer materialisiert. Es gibt viele gute Gründe für die Verwendung von CTEs, aber wenn sie nicht sorgfältig verwendet werden, kann dies zu erheblichen Leistungseinbußen führen. Es gibt jedoch viele Fälle, in denen der Optimierungsbereich die Leistung tatsächlich verbessern kann. Beachten Sie dies, und vermeiden Sie dies nicht blind.