データ型の変換

多くの場合、あるデータ型の値を別のデータ型に変換できます。たとえば、 INTEGER は、 浮動小数点データ型 に変換できます。データ型の変換は、 キャスト と呼ばれます。

このトピックの内容:

明示的キャストと暗黙的キャスト

ユーザーは、あるデータ型から別のデータ型に値を明示的に変換できます。これは 明示的キャスト と呼ばれます。

状況によっては、Snowflakeは値を別のデータ型に自動的に変換します。これは、 暗黙的キャスト または 強制 と呼ばれます。

明示的キャスト

ユーザーは、次のオプションのいずれかを使用して、明示的に値をキャストできます。

  • CAST 関数。

  • :: 演算子(呼称: キャスト演算子)。

  • 適切な SQL 関数(例: TO_DOUBLE)。

例:

SELECT CAST('2022-04-01' AS DATE);

SELECT '2022-04-01'::DATE;

SELECT TO_DATE('2022-04-01');
Copy

キャストは、 WHERE 句を含む、一般的な式が許可されているほとんどのコンテキストで許可されています。例:

SELECT date_column
    FROM log_table
    WHERE date_column >= '2022-04-01'::DATE;
Copy

暗黙的キャスト(「強制」)

強制は、関数(または演算子)が引数(またはオペランド)とは異なるが、互換性のあるデータ型を必要とする場合に発生します。

  • 関数またはストアドプロシージャの例:

    • 次のコードは、列 my_integer_column の INTEGER 値を FLOAT に強制して、 FLOAT を期待する関数 my_float_function() に値を渡すことができるようにします。

      SELECT my_float_function(my_integer_column)
          FROM my_table;
      
      Copy
  • 演算子の例:

    • 次のコードは、 INTEGER 値 17 を VARCHAR に強制して、 || 演算子を使用して値を連結できるようにします。

      SELECT 17 || '76';
      
      Copy

      この SELECT ステートメントの結果は、文字列 '1776' です。

    • 次のステートメントは、列 my_integer_column の INTEGER 値を FLOAT に強制し、 < 比較演算子を使用して値を値 my_float_column と比較できるようにします。

      SELECT ...
          FROM my_table
          WHERE my_integer_column < my_float_column;
      
      Copy

すべてのコンテキスト(例: すべての演算子ではない)が強制をサポートしているわけではありません。

キャストと優先順位

式内でキャストする場合、コードは、式内の他の演算子に対するキャスト演算子の優先順位を考慮に入れる必要があります。

次の例を考えてみましょう:

SELECT height * width::VARCHAR || " square meters"
    FROM dimensions;
Copy

キャスト演算子は算術演算子 * (乗算)よりも優先順位が高いため、ステートメントは次のように解釈されます。

... height * (width::VARCHAR) ...
Copy

height * width の結果をキャストするには、以下に示すように括弧を使用します。

SELECT (height * width)::VARCHAR || " square meters"
    FROM dimensions;
Copy

別の例として、次のステートメントを考えます。

SELECT -0.0::FLOAT::BOOLEAN;
Copy

これは次のように解釈されると思われるかもしれません。

SELECT (-0.0::FLOAT)::BOOLEAN;
Copy

したがって、 FALSE (0 = FALSE、1 = TRUE)を返します。

ただし、キャスト演算子は単項マイナス(否定)演算子よりも優先順位が高いため、ステートメントは次のように解釈されます。

SELECT -(0.0::FLOAT::BOOLEAN);
Copy

したがって、単項マイナスを BOOLEAN に適用できないため、エラーメッセージが表示されます。

キャストできるデータ型

次のテーブルに、Snowflakeでの有効なデータ型変換を示します。このテーブルには、Snowflakeが自動的に実行できる強制も示されています。

注釈

内部的には、 CAST 関数と :: 演算子が適切な変換関数を呼び出します。たとえば、 NUMBER を BOOLEAN にキャストすると、Snowflakeは TO_BOOLEAN 関数を呼び出します。各変換関数の使用上の注意は、関数がキャストを介して間接的に呼び出された場合、および関数が直接呼び出された場合に適用されます。たとえば、 CAST(my_decimal_column as BOOLEAN) を実行すると、 DECIMAL 値で TO_BOOLEAN を呼び出すためのルールが適用されます。便宜上、以下のテーブルの「メモ」列には、関連する変換関数へのリンクが含まれています。

ソースデータ型

ターゲットデータ型

キャスト可能

強制可能

変換関数

メモ

ARRAY

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

BINARY

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

BOOLEAN

NUMBER

TO_NUMBER

VARCHAR

TO_VARCHAR

たとえば、 TRUE から「true」まで。

VARIANT

TO_VARIANT

DATE

TIMESTAMP

TO_TIMESTAMP

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

FLOAT . (浮動小数点数)

BOOLEAN

TO_BOOLEAN

たとえば、0.0から FALSE まで。

NUMBER[(p,s)]

TO_NUMBER

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

GEOGRAPHY

VARIANT

TO_VARIANT

GEOMETRY

VARIANT

TO_VARIANT

NUMBER[(p,s)] . (INTEGER を含む固定小数点数)

BOOLEAN

TO_BOOLEAN

たとえば、0から FALSE まで。

FLOAT

TO_DOUBLE

TIMESTAMP

TO_TIMESTAMP

1

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

OBJECT

ARRAY

TO_ARRAY

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

TIME

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

TIMESTAMP

DATE

TO_DATE , DATE

TIME

TO_TIME , TIME

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

VARCHAR

BOOLEAN

TO_BOOLEAN

たとえば、「false」から FALSE まで。

DATE

TO_DATE , DATE

FLOAT

TO_DOUBLE

たとえば、「12.34」から12.34まで。

NUMBER[(p,s)]

TO_NUMBER

たとえば、「12.34」から12.34まで。

TIME

TO_TIME , TIME

TIMESTAMP

TO_TIMESTAMP

VARIANT

TO_VARIANT

VARIANT

ARRAY

TO_ARRAY

BOOLEAN

TO_BOOLEAN

たとえば、「false」を含む VARIANT から FALSE まで。

DATE

TO_DATE , DATE

FLOAT

TO_DOUBLE

GEOGRAPHY

TO_GEOGRAPHY

NUMBER[(p,s)]

TO_NUMBER

OBJECT

TO_OBJECT

TIME

TO_TIME , TIME

TIMESTAMP

TO_TIMESTAMP

VARCHAR

TO_VARCHAR

1

NUMBER 値はエポックの開始からの秒数として扱われるため、 TIMESTAMP に変換できます(1970-01-01 00:00:00)。

注意:

  • リストされたデータ型(例: FLOAT)ごとに、そのデータ型のすべてのエイリアスにルールが適用されます(例: FLOAT のルールは、 FLOAT のエイリアスである DOUBLE に適用されます)。

使用上の注意

特に明記されていない限り、明示的なキャストと暗黙的なキャストの両方に次のルールが適用されます。

  • 変換は、データ型だけでなく、ソースの値にも依存します。例:

    • VARCHAR 「123」は数値に変換できますが、 VARCHAR 「xyz」は数値に変換できません。

    • 型 VARIANT の特定の値をキャストできるかどうかは、 VARIANT 内部 のデータの型によって異なります。たとえば、 VARIANT に型 TIME の値が含まれている場合は、 TIME を TIMESTAMP にキャストできないため、 VARIANT を TIMESTAMP にキャストすることはできません。

  • If possible, pass in arguments of the same type. Avoid passing in arguments of different types.

  • If one of the arguments is a number, the function coerces non-numeric string arguments (e.g. 'a string') and string arguments that are not constants to the type NUMBER(18,5).

    For numeric string arguments that are not constants, if NUMBER(18,5) is not sufficient to represent the numeric value, you should cast the argument to a type that can represent the value.

  • 一部のデータ型のペアでは、変換によって精度が低下する可能性があります。例:

    • FLOAT を INTEGER に変換すると、値が丸められます。

    • 固定小数点数を正確に表すことができない場合は、値を固定小数点数値(例: NUMBER(38、0))から浮動小数点(例: FLOAT)に変換すると、丸めまたは切り捨てが発生する可能性があります。

    • TIMESTAMP を DATE に変換すると、時刻に関する情報が削除されます。

  • Snowflakeは、精度が低下する可能性がある一部の状況では値を変換しますが、Snowflakeは、精度が低下する可能性がある他の状況では変換を許可しません。たとえば、Snowflakeは、変換が次の場合に変換を許可しません。

    • VARCHAR 値の切り捨て。たとえば、Snowflakeは、暗黙的または明示的に、 VARCHAR(10) を VARCHAR(5) にキャストしません。

    • 最下位数以外の桁が失われます。たとえば、次は失敗します。

      select 12.3::FLOAT::NUMBER(3,2);
      
      Copy

    この例では、数値 12.3 には小数点の前に2桁ありますが、データ型 NUMBER(3,2) には小数点の前に1桁のスペースしかありません。

  • 精度の低いタイプから精度の高いタイプに変換する場合、変換ではデフォルト値が使用されます。たとえば、 DATE を TIMESTAMP_NTZ に変換すると、時、分、秒、および小数秒が0に設定されます。

  • FLOAT 値が VARCHAR にキャストされる場合、後続のゼロは省略されます。

    たとえば、次のステートメントはテーブルを作成し、 VARCHAR、 FLOAT、および VARIANT を含む行を挿入します。VARIANT は、後続のゼロで表される浮動小数点値を含む JSON から構築されます。

    create or replace table tmp (
        varchar1 varchar, 
        float1 float, 
        variant1 variant
        );
    
    insert into tmp select '5.000', 5.000, parse_json('{"Loan Number": 5.000}');
    
    Copy

    次の SELECT ステートメントは、 FLOAT 列と VARIANT 列内の FLOAT 値の両方を VARCHAR に明示的にキャストします。いずれの場合も、 VARCHAR には後続のゼロが含まれていません。

    select varchar1, 
           float1::varchar,
           variant1:"Loan Number"::varchar from tmp;
    +----------+-----------------+---------------------------------+
    | VARCHAR1 | FLOAT1::VARCHAR | VARIANT1:"LOAN NUMBER"::VARCHAR |
    |----------+-----------------+---------------------------------|
    | 5.000    | 5               | 5                               |
    +----------+-----------------+---------------------------------+
    
    Copy
  • 一部の操作では、条件式に応じて、異なるデータ型を返す可能性があります。たとえば、次の COALESCE 呼び出しは、入力値に応じてわずかに異なるデータ型を返します。

    select system$typeof(ifnull(12.3, 0)),
           system$typeof(ifnull(NULL, 0));
    
    +--------------------------------+--------------------------------+
    | SYSTEM$TYPEOF(IFNULL(12.3, 0)) | SYSTEM$TYPEOF(IFNULL(NULL, 0)) |
    +--------------------------------+--------------------------------+
    | NUMBER(3,1)[SB1]               | NUMBER(1,0)[SB1]               |
    +--------------------------------+--------------------------------+
    
    Copy

    式に複数の可能なデータ型がある場合、Snowflakeは実際の結果に基づいてデータ型を選択します。(計算の精度とスケールの詳細については、 算術演算のスケールと精度 をご参照ください。)クエリが複数の結果(例: 結果の複数の行)を生成する場合、Snowflakeは、各結果それぞれを保持できるデータ型を選択します。

  • SnowSQL などの一部のアプリケーションプログラム、および Classic Console などの一部のグラフィカルユーザーインターフェイスは、データを表示するときに独自の変換およびフォーマットルールを適用します。たとえば、 SnowSQL は、 BINARY の値を16進数のみが含まれる文字列として表示します。その文字列は、変換関数を暗黙的に呼び出すことによって生成されます。したがって、 SnowSQL が表示するデータは、Snowflakeがどのデータ変換を強制したかを明確に示していない可能性があります。