データ型の変換

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

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

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

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

明示的キャスト

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

  • CAST 関数。

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

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

たとえば、各クエリは文字列の値を DATE 値にキャストします。

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

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

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

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

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

暗黙的キャスト(強制)

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

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

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

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

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

      SELECT 17 || '76';
      

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

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

      SELECT ...
        FROM my_table
        WHERE my_integer_column < my_float_column;
      

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

キャスティングと優先順位

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

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

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

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

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

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

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

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

SELECT -0.0::FLOAT::BOOLEAN;

これは次の例に示すように解釈されると予想できるかもしれません。

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

したがって、 FALSE (0= FALSE、1= TRUE)を返すと予想されます。

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

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

したがって、クエリ結果はエラーメッセージとなります。これは、単項マイナスを BOOLEAN に適用できないためです。

キャストできるデータ型

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

注釈

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

半構造化型構造化された型 間の変換の詳細については、 構造化型と半構造化型の変換 をご参照ください。

ソースデータ型

ターゲットデータ型

キャスト可能

強制可能

変換関数

注意

ARRAY

VARCHAR

TO_VARCHAR

なし。

VARIANT

TO_VARIANT

なし。

VECTOR

変換には 明示的キャスト を使用します。詳細については、 ベクトル変換 をご参照ください。

BINARY

VARCHAR

TO_VARCHAR

なし。

VARIANT

TO_VARIANT

なし。

BOOLEAN

DECFLOAT

TO_DECFLOAT

たとえば、 FALSE から 0 に。

NUMBER

TO_NUMBER

なし。

VARCHAR

TO_VARCHAR

たとえば、 TRUE から 'true' に。

VARIANT

TO_VARIANT

なし。

DATE

TIMESTAMP

TO_TIMESTAMP

なし。

VARCHAR

TO_VARCHAR

なし。

VARIANT

TO_VARIANT

なし。

DECFLOAT . (10進浮動小数点数)

BOOLEAN

TO_BOOLEAN

たとえば、 0 から FALSE に。

FLOAT

TO_DOUBLE

なし。

NUMBER[(p,s)]

TO_NUMBER

なし。

VARCHAR

TO_VARCHAR

なし。

FLOAT . (浮動小数点数)

BOOLEAN

TO_BOOLEAN

たとえば、 0.0 から FALSE に。

DECFLOAT

TO_DECFLOAT

なし。

NUMBER[(p,s)]

TO_NUMBER

なし。

VARCHAR

TO_VARCHAR

なし。

VARIANT

TO_VARIANT

なし。

GEOGRAPHY

VARIANT

TO_VARIANT

なし。

GEOMETRY

VARIANT

TO_VARIANT

なし。

インターバルデータ型

NUMBER[(p,s)]

TO_NUMBER

なし。

VARCHAR

TO_VARCHAR

なし。

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

BOOLEAN

TO_BOOLEAN

たとえば、 0 から FALSE に。

DECFLOAT

TO_DECFLOAT

なし。

FLOAT

TO_DOUBLE

なし。

インターバルデータ型

---

キャストは、単一のコンポーネントを持つインターバルデータ型(INTERVAL YEAR、INTERVAL DAY、INTERVAL HOUR、INTERVAL MINUTE、および INTERVAL SECOND)でのみサポートされます。

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

なし。

DECFLOAT

TO_DECFLOAT

なし。

FLOAT

TO_DOUBLE

たとえば、 '12.34' から 12.34 に。

インターバルデータ型

---

VARCHAR 値は、:ref:`インターバルリテラル<label-interval_data_types_interval_literals>`と同じ方法で解析されます。

NUMBER[(p,s)]

TO_NUMBER

たとえば、 '12.34' から 12.34 に。

TIME

TO_TIME , TIME

なし。

TIMESTAMP

TO_TIMESTAMP

なし。

UUID

TO_UUID

なし。

VARIANT

TO_VARIANT

なし。

UUID

VARCHAR

TO_VARCHAR

なし。

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

なし。

VECTOR

VARIANT には、 FLOAT または INT 型の ARRAY が含まれている必要があります。

VECTOR

ARRAY

TO_ARRAY

なし。

注釈

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

使用上の注意

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

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

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

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

  • Snowflakeは引数の 暗黙的な変換 を実行して互換性を持たせます。たとえば、入力式の1つが数値型の場合、戻り型も数値型になります。つまり SELECT COALESCE('17', 1); は最初に VARCHAR 値の '17' を NUMBER 値の 17 に変換し、最初の非 NULL 値を返します。

    変換が不可能な場合は、暗黙的な変換は失敗します。たとえば、 SELECT COALESCE('foo', 1); はエラーを返します。これは VARCHAR 値の 'foo' を NUMBER 値に変換できないためです。

    同じ型の引数を渡すか、必要に応じて引数を明示的に変換することをお勧めします。

  • 暗黙的な変換が非数値を数値に変換する場合、結果は NUMBER(18,5)型の値になります。

    定数ではない数値文字列引数で、 NUMBER(18,5)が数値を表すのに十分でない場合は、値を表すことができる型に引数を キャスト します。

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

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

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

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

  • Snowflakeは、精度の損失が発生する可能性のある状況で値を変換する場合もありますが、Snowflakeは精度の損失が発生する可能性のある他の状況では変換を許可しません。たとえば、Snowflakeは、変換によって次の状況が発生する場合に変換を許可しません。

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

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

      SELECT 12.3::FLOAT::NUMBER(3,2);
      

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

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

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

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

    CREATE OR REPLACE TABLE convert_test_zeros (
      varchar1 VARCHAR,
      float1 FLOAT,
      variant1 VARIANT);
    
    INSERT INTO convert_test_zeros SELECT
      '5.000',
      5.000,
      PARSE_JSON('{"Loan Number": 5.000}');
    

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

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

    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]               |
    +--------------------------------+--------------------------------+
    

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

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