データ型の変換¶
多くの場合、あるデータ型の値を別のデータ型に変換できます。たとえば、 INTEGER は、 浮動小数点データ型 に変換できます。データ型の変換は、 キャスト と呼ばれます。
このトピックの内容:
明示的キャストと暗黙的キャスト¶
ユーザーは、あるデータ型から別のデータ型に値を明示的に変換できます。これは 明示的キャスト と呼ばれます。
状況によっては、Snowflakeは値を別のデータ型に自動的に変換します。これは、 暗黙的キャスト または 強制 と呼ばれます。
明示的キャスト¶
ユーザーは、次のオプションのいずれかを使用して、明示的に値をキャストできます。
例:
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)
を実行すると、 DECIMAL 値で TO_BOOLEAN
を呼び出すためのルールが適用されます。便宜上、以下のテーブルの「メモ」列には、関連する変換関数へのリンクが含まれています。
半構造化型 と 構造化型 間の変換の詳細については、 構造化型と半構造化型の変換 をご参照ください。
ソースデータ型 |
ターゲットデータ型 |
キャスト可能 |
強制可能 |
変換関数 |
メモ |
---|---|---|---|---|---|
ARRAY |
|||||
✔ |
❌ |
||||
✔ |
✔ |
||||
BINARY |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
BOOLEAN |
|||||
✔ |
❌ |
||||
✔ |
✔ |
たとえば、 TRUE から「true」まで。 |
|||
✔ |
✔ |
||||
DATE |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
FLOAT . (浮動小数点数) |
|||||
✔ |
✔ |
たとえば、0.0から FALSE まで。 |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
GEOGRAPHY |
|||||
✔ |
❌ |
||||
GEOMETRY |
|||||
✔ |
❌ |
||||
NUMBER[(p,s)] . (INTEGER を含む固定小数点数) |
|||||
✔ |
✔ |
たとえば、0から FALSE まで。 |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
OBJECT |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
✔ |
✔ |
||||
TIME |
|||||
✔ |
✔ |
||||
✔ |
❌ |
||||
TIMESTAMP |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
VARCHAR |
|||||
✔ |
✔ |
たとえば、「false」から FALSE まで。 |
|||
✔ |
✔ |
||||
✔ |
✔ |
たとえば、「12.34」から12.34まで。 |
|||
✔ |
✔ |
たとえば、「12.34」から12.34まで。 |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
VARIANT |
|||||
✔ |
✔ |
||||
✔ |
✔ |
たとえば、「false」を含む VARIANT から FALSE まで。 |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
注意:
リストされたデータ型(例: FLOAT)ごとに、そのデータ型のすべてのエイリアスにルールが適用されます(例: FLOAT のルールは、 FLOAT のエイリアスである DOUBLE に適用されます)。
使用上の注意¶
特に明記されていない限り、明示的なキャストと暗黙的なキャストの両方に次のルールが適用されます。
変換は、データ型だけでなく、ソースの値にも依存します。例:
VARCHAR 「123」は数値に変換できますが、 VARCHAR 「xyz」は数値に変換できません。
型 VARIANT の特定の値をキャストできるかどうかは、 VARIANT 内部 のデータの型によって異なります。たとえば、 VARIANT に型 TIME の値が含まれている場合は、 TIME を TIMESTAMP にキャストできないため、 VARIANT を TIMESTAMP にキャストすることはできません。
可能であれば、同じ型の引数を渡します。異なる型の引数を渡すことは避けます。
引数の1つが数値の場合、関数は、非数値文字列引数(例:
'a string'
)と型 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 tmp ( varchar1 varchar, float1 float, variant1 variant ); insert into tmp 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 tmp; +----------+-----------------+---------------------------------+ | VARCHAR1 | FLOAT1::VARCHAR | VARIANT1:"LOAN NUMBER"::VARCHAR | |----------+-----------------+---------------------------------| | 5.000 | 5 | 5 | +----------+-----------------+---------------------------------+
一部の操作では、条件式に応じて、異なるデータ型を返す可能性があります。たとえば、次の 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] | +--------------------------------+--------------------------------+
式に複数の可能なデータ型がある場合、Snowflakeは実際の結果に基づいてデータ型を選択します。(計算の精度とスケールの詳細については、 算術演算のスケールと精度 をご参照ください。)クエリが複数の結果(例: 結果の複数の行)を生成する場合、Snowflakeは、各結果それぞれを保持できるデータ型を選択します。
SnowSQL などの一部のアプリケーションプログラム、および Classic Console などの一部のグラフィカルユーザーインターフェイスは、データを表示するときに独自の変換およびフォーマットルールを適用します。たとえば、 SnowSQL は、 BINARY の値を16進数のみが含まれる文字列として表示します。その文字列は、変換関数を暗黙的に呼び出すことによって生成されます。したがって、 SnowSQL が表示するデータは、Snowflakeがどのデータ変換を強制したかを明確に示していない可能性があります。