Kategorien:

Abfragesyntax

VALUES

In der SELECT-Anweisung ermöglicht die Unterklausel VALUES der FROM-Klausel die Angabe einer Menge von Konstanten zur Bildung einer endlichen Menge von Zeilen.

Informationen zur VALUES-Klausel in der INSERT-Anweisung finden Sie in der Dokumentation für die INSERT-Anweisung.

Syntax

SELECT ...
FROM ( VALUES ( <expr> [ , <expr> [ , ... ] ] ) [ , ( ... ) ] )
  [ [ AS ] <table_alias> [ ( <column_alias> [ , ... ] ) ] ]
[ ... ]

Parameter

expr

Jeder Ausdruck muss eine Konstante sein oder ein Ausdruck, die bzw. der bei der Kompilierung der SQL-Anweisung als eine Konstante ausgewertet werden kann.

Die meisten einfachen arithmetischen Ausdrücke und Zeichenfolgenfunktionen können zur Kompilierungszeit ausgewertet werden, die meisten anderen Ausdrücke jedoch nicht.

table_alias

Ein optionaler Alias, um der Gruppe von Zeilen einen Namen zu geben, als wäre die Gruppe von Zeilen eine Tabelle.

column_alias

Optionale Spaltenaliasse können die Spaltennamen angeben.

Nutzungshinweise

  • In einer FROM-Klausel darf eine VALUES-Klausel nicht das Schlüsselwort DEFAULT enthalten. Diese Beschränkung steht im Gegensatz zu einer VALUES-Klausel in einer INSERT-Anweisung, die die Verwendung von DEFAULT unterstützt. Beispiel: INSERT INTO table VALUES (10, DEFAULT, 'Name') ....

  • Wenn eine VALUES-Klausel mehrere Werte unterschiedlicher Datentypen für dieselbe Spalte enthält, bestimmt Snowflake einen gemeinsamen Datentyp, der alle Werte umfassen kann, und konvertiert jeden Wert implizit in diesen gemeinsamen Typ. Wenn Ihnen diese Konvertierung nicht bewusst ist, kann sie zu unerwarteten Ergebnissen oder Fehlern führen.

    Um unerwartete Koersion zu vermeiden, wandeln Sie (CAST) jeden Wert in den gewünschten Typ um, teilen Sie die Werte in mehrere SQL-Anweisungen auf oder stellen sicher, dass alle Werte in einer Spalte denselben Typ haben.

    Numerisches Beispiel

    Wenn sich numerische Werte in derselben Spalte in der Skalierung oder Genauigkeit erheblich unterscheiden, kann Snowflake einen out of range-Fehler zurückgeben, da ein Wert nicht in den ermittelten allgemeinen numerischen Typ passt.

    SELECT column1 FROM VALUES
      (3.469446951953614e-18),
      (115898.73);
    
    100039 (22003): Numeric value '115898.73' is out of range
    

    Insbesondere für numerische Werte können Sie auch Werte als Textzeichenfolgen in Anführungszeichen angeben und diese dann bei Bedarf in numerische Werte konvertieren.

    **Beispiele für Zeitstempel*

    Wenn Zeitstempelwerte verschiedener Typen in derselben Spalte angezeigt werden, konvertiert Snowflake alle Werte in einen gemeinsamen Zeitstempeltyp. Im folgenden Beispiel wird ein Wert des Typs TIMESTAMP_NTZ auf TIMESTAMP_LTZ gesetzt:

    SELECT $1 AS a, SYSTEM$TYPEOF(a) FROM VALUES
      (TO_TIMESTAMP_LTZ('2025-03-24 01:37:00 -0700')),
      (TO_TIMESTAMP_NTZ('2025-03-24 08:37:00'));
    
    +-------------------------------+------------------+
    | A                             | SYSTEM$TYPEOF(A) |
    |-------------------------------+------------------|
    | 2025-03-24 01:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    | 2025-03-24 08:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    +-------------------------------+------------------+
    
  • Die VALUES-Klausel ist auf 200.000 Zeilen begrenzt.

Beispiele

Die folgenden Beispiele verwenden die VALUES-Klausel, um einen festen, bekannten Satz von Zeilen zu generieren:

SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+---------+
| COLUMN1 | COLUMN2 |
|---------+---------|
|       1 | one     |
|       2 | two     |
|       3 | three   |
+---------+---------+

Sie können Werte entweder über den Spaltennamen (implizit) oder über die Spaltenposition referenzieren. Im folgenden Beispiel wird die zweite Spalte nach Spaltenposition referenziert:

SELECT column1, $2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+-------+
| COLUMN1 | $2    |
|---------+-------|
|       1 | one   |
|       2 | two   |
|       3 | three |
+---------+-------+

Im folgenden Beispiel werden mehrere VALUES-Klauseln durch Verwendung von Aliassen unterschieden:

SELECT v1.$2, v2.$2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1
        INNER JOIN (VALUES (1, 'One'), (3, 'three')) AS v2
  WHERE v2.$1 = v1.$1;

Sie können auch Aliasse für die Spaltennamen angeben, wie im folgenden Beispiel gezeigt:

SELECT c1, c2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1 (c1, c2);