カテゴリ:

クエリ構文

VALUES

SELECT ステートメントでは、FROM 句の VALUES 副次句により、定数のセットを指定して有限の行セットを形成します。

INSERT ステートメントの VALUES 句については、 INSERT ステートメントのドキュメントをご参照ください。

構文

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

パラメーター

expr

各式は定数、または SQL ステートメントのコンパイル中に定数として評価できる式でなければなりません。

ほとんどの単純な算術式と文字列関数はコンパイル時に評価できますが、他のほとんどの式は評価できません。

table_alias

行のセットがテーブルであるかのように、行のセットに名前を付けるためのオプションのエイリアスです。

column_alias

オプションの列エイリアスは、列名を指定できます。

使用上の注意

  • FROM 句内では、 VALUES 句に DEFAULT キーワードを含めることはできません。この制限は、DEFAULT の使用をサポートする INSERT ステートメントの VALUES 句(例: INSERT INTO table VALUES (10, DEFAULT, 'Name') ...)とは対照的です。

  • VALUES 句に、同じ列の複数の数値が含まれており、その値のスケールや精度が大幅に異なる場合、Snowflakeは out of range エラーを返す可能性があります。個々の値がターゲット列のデータ型でエラーにならない場合でも、エラーが返される場合があります。

    エラーが発生するのは、Snowflakeでは VALUES 句で提供されるすべての数値リテラルを包含できる共通の数値データ型を決定するが、一部の値は決定された共通データ型の範囲外になる場合があるためです。

    たとえば、次のステートメントは out of range エラーを返します。

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

    次の変更を行うと、このタイプのエラーを回避できます。

    • VALUES 句の値を複数の SQL ステートメントに区切ります。

    • 値を FLOAT のようなより広い範囲の値のデータ型にキャストします。ただし、キャストすると数値精度が低下する可能性があります。

    • 値を引用符で囲んだテキスト文字列として指定し、必要に応じて値を数値に変換します。

  • VALUES 句は16,384行に制限されます。

次の例では、VALUES 句を使用して、固定の既知の行セットを生成します。

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

値は、列名(暗黙)または列の位置のいずれかで参照できます。次の例では、2番目の列を列の位置で参照します。

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

次の例では、エイリアスを使用して複数の VALUES 句を区別しています。

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;
Copy

次の例に示すように、列名のエイリアスを指定することもできます。

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