カテゴリ:

変換関数

CAST、 ::

あるデータ型の値を別のデータ型に変換します。CAST のセマンティクスは、対応する TO_ datatype 変換関数のセマンティクスと同じです。キャストが不可能な場合は、エラーが発生します。詳細については、個々の TO_ datatype 変換関数をご参照ください。データ型変換と TO_ datatype 変換関数の詳細については、 データ型の変換 をご参照ください。

:: 演算子は、 CASTの代替構文を提供します。

こちらもご参照ください。

TRY_CAST

構文

CAST( <source_expr> AS <target_data_type> )
  [ RENAME FIELDS | ADD FIELDS ]

<source_expr> :: <target_data_type>

引数

source_expr

異なるデータ型に変換される、サポートされているデータ型の式です。

target_data_type

式を変換するデータ型です。データ型が、 精度やスケール (数値/小数用)などの追加のプロパティをサポートする場合は、プロパティを含めることができます。

RENAME FIELDS

構造化 OBJECTs の場合、異なるキーと値のペアを使用するために OBJECT を変更することを指定します。元のオブジェクトの値は、新しいキーと値のペアにそれらが表示される順でコピーされます。

例については、 例: OBJECT 値内のキー名の変更 をご参照ください。

ADD FIELDS

構造化 OBJECTs の場合、 OBJECT にキーと値のペアを追加することを指定します。

例については、 例: OBJECT 値へのキーの追加 をご参照ください。

新しく追加されたキーの値は NULL に設定されます。これらのキーに値を割り当てる場合は、 OBJECT_INSERT 関数を代わりに呼び出します。

使用上の注意

  • スケールが入力値を保持するのに十分でない場合、関数は値を丸めます。

  • 精度が入力値を保持するのに十分でない場合、関数はエラーを発生します。

  • Parquetファイルへのデータのアンロード中に、数値列が整数データ型の形式に明示的にキャストされる場合、Parquetファイル内にあるこれらの列のデータ型は INT です。詳細については、 明示的に数値列をParquetデータ型に変換する をご参照ください。

  • Collation specifications aren't retained when values are cast to text string data types (for example, VARCHAR and STRING). You can include collation specifications when you cast values (for example, CAST(myvalue AS VARCHAR) COLLATE 'en-ai').

  • :: 代替構文を使用する場合、 RENAME FIELDS または ADD FIELDS の引数を指定することはできません。

CAST の例では、以下のテーブルのデータを使用しています。

CREATE OR REPLACE TABLE test_data_type_conversion (
  varchar_value VARCHAR,
  number_value NUMBER(5, 4),
  timestamp_value TIMESTAMP);

INSERT INTO test_data_type_conversion VALUES (
  '9.8765',
  1.2345,
  '2024-05-09 14:32:29.135 -0700');

SELECT * FROM test_data_type_conversion;
+---------------+--------------+-------------------------+
| VARCHAR_VALUE | NUMBER_VALUE | TIMESTAMP_VALUE         |
|---------------+--------------+-------------------------|
| 9.8765        |       1.2345 | 2024-05-09 14:32:29.135 |
+---------------+--------------+-------------------------+

例では、変換後の値のデータ型を示すために SYSTEM$TYPEOF 関数を使用しています。

文字列を指定されたスケール(2)で数値に変換します。

SELECT CAST(varchar_value AS NUMBER(5,2)) AS varchar_to_number1,
       SYSTEM$TYPEOF(varchar_to_number1) AS data_type
  FROM test_data_type_conversion;
+--------------------+------------------+
| VARCHAR_TO_NUMBER1 | DATA_TYPE        |
|--------------------+------------------|
|               9.88 | NUMBER(5,2)[SB4] |
+--------------------+------------------+

:: 表記を使用して、同じ文字列をスケール5で数値に変換します。

SELECT varchar_value::NUMBER(6,5) AS varchar_to_number2,
       SYSTEM$TYPEOF(varchar_to_number2) AS data_type
  FROM test_data_type_conversion;
+--------------------+------------------+
| VARCHAR_TO_NUMBER2 | DATA_TYPE        |
|--------------------+------------------|
|            9.87650 | NUMBER(6,5)[SB4] |
+--------------------+------------------+

数値を整数に変換します。整数の場合は精度とスケールが指定できないため、デフォルトは常に NUMBER(38, 0)です。

SELECT CAST(number_value AS INTEGER) AS number_to_integer,
       SYSTEM$TYPEOF(number_to_integer) AS data_type
  FROM test_data_type_conversion;
+-------------------+-------------------+
| NUMBER_TO_INTEGER | DATA_TYPE         |
|-------------------+-------------------|
|                 1 | NUMBER(38,0)[SB1] |
+-------------------+-------------------+

数値を文字列に変換します。

SELECT CAST(number_value AS VARCHAR) AS number_to_varchar,
       SYSTEM$TYPEOF(number_to_varchar) AS data_type
  FROM test_data_type_conversion;
+-------------------+--------------+
| NUMBER_TO_VARCHAR | DATA_TYPE    |
|-------------------+--------------|
| 1.2345            | VARCHAR[LOB] |
+-------------------+--------------+

Convert a string to a VARCHAR value with a specified length:

SELECT varchar_value,
       SYSTEM$TYPEOF(varchar_value) AS data_type_source,
       CAST(varchar_value AS VARCHAR(9)) AS converted_varchar,
       SYSTEM$TYPEOF(converted_varchar) AS data_type_converted
  FROM test_data_type_conversion;
+---------------+------------------------+-------------------+---------------------+
| VARCHAR_VALUE | DATA_TYPE_SOURCE       | CONVERTED_VARCHAR | DATA_TYPE_CONVERTED |
|---------------+------------------------+-------------------+---------------------|
| 9.8765        | VARCHAR(16777216)[LOB] | 9.8765            | VARCHAR(9)[LOB]     |
+---------------+------------------------+-------------------+---------------------+

If you are casting a value to the VARCHAR type with a specified length and the value exceeds that length, an error is returned:

SELECT CAST(varchar_value AS VARCHAR(4))
  FROM test_data_type_conversion;
100078 (22000): String '9.8765' is too long and would be truncated

タイムスタンプを日付に変換します。

SELECT CAST(timestamp_value AS DATE) AS timestamp_to_date,
       SYSTEM$TYPEOF(timestamp_to_date) AS data_type
  FROM test_data_type_conversion;
+-------------------+-----------+
| TIMESTAMP_TO_DATE | DATA_TYPE |
|-------------------+-----------|
| 2024-05-09        | DATE[SB4] |
+-------------------+-----------+