カテゴリ:

クエリ構文

VALUES

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

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

構文

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

パラメーター

expr

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

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

table_alias

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

column_alias

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

使用上の注意

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

  • VALUES句に同じ列の異なるデータ型の複数の値が含まれる場合、Snowflakeはすべての値を包含できる共通のデータ型を決定し、各値をその共通の型に暗黙的に変換します。この変換を認識していない場合は、予期しない結果やエラーが発生する可能性があります。

    予期しない強制を回避するために、明示的に各値を目的の型にCASTし、値を複数のSQLステートメントに分割するか、列内のすべての値が同じ型を共有するようにします。

    数値の例

    同じ列の数値のスケールまたは精度が大幅に異なる場合、値が決定された一般的な数値型に適合しないため、Snowflakeは``out of range``エラーを返す可能性があります。

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

    特に数値の場合は、値を引用符で囲まれたテキスト文字列として指定し、必要に応じて数値に変換することもできます。

    タイムスタンプの例

    異なる型のタイムスタンプ値が同じ列に表示される場合、Snowflakeはすべての値を共通のタイムスタンプ型に変換します。次の例では、TIMESTAMP_NTZ値がTIMESTAMP_LTZに強制されています。

    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) |
    +-------------------------------+------------------+
    
  • VALUES句は200,000行に制限されます。

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

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

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

SELECT column1, $2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+-------+
| 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;

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

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