データ型の変換¶
多くの場合、あるデータ型の値を別のデータ型に変換できます。たとえば、 INTEGER の値は、 浮動小数点データ型 の値に変換できます。データ型の変換は、 キャスト と呼ばれます。
このトピックの内容:
明示的キャストと暗黙的キャスト¶
ユーザーは、あるデータ型から別のデータ型に値を明示的に変換できます。これは 明示的キャスト と呼ばれます。
状況によっては、Snowflakeは値を別のデータ型に自動的に変換します。これは、 暗黙的キャスト または 強制 と呼ばれます。
明示的キャスト¶
ユーザーは、次のオプションのいずれかを使用して、明示的に値をキャストできます。
たとえば、各クエリは文字列の値を 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)
を実行すると、 DECIMAL 値で TO_BOOLEAN を呼び出すためのルールが適用されます。便宜上、テーブルには関連する変換関数へのリンクが含まれています。
半構造化型 と 構造化型 間の変換の詳細については、 構造化型と半構造化型の変換 をご参照ください。
ソースデータ型 |
ターゲットデータ型 |
キャスト可能 |
強制可能 |
変換関数 |
メモ |
---|---|---|---|---|---|
ARRAY |
|||||
✔ |
❌ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
BINARY |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
BOOLEAN |
|||||
✔ |
❌ |
||||
✔ |
✔ |
たとえば、 |
|||
✔ |
✔ |
||||
DATE |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
FLOAT . (浮動小数点数) |
|||||
✔ |
✔ |
たとえば、 |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
GEOGRAPHY |
|||||
✔ |
❌ |
||||
GEOMETRY |
|||||
✔ |
❌ |
||||
NUMBER[(p,s)] . (INTEGERを含む固定小数点数) |
|||||
✔ |
✔ |
たとえば、 |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
OBJECT |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
✔ |
✔ |
||||
TIME |
|||||
✔ |
✔ |
||||
✔ |
❌ |
||||
TIMESTAMP |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
VARCHAR |
|||||
✔ |
✔ |
たとえば、 |
|||
✔ |
✔ |
||||
✔ |
✔ |
たとえば、 |
|||
✔ |
✔ |
たとえば、 |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
VARIANT |
|||||
✔ |
✔ |
||||
✔ |
✔ |
たとえば、 |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
VARIANT には、 FLOAT または INT 型の ARRAY が含まれている必要があります。 |
|||
VECTOR |
|||||
✔ |
✔ |
注釈
リストされたデータ型(例: FLOAT)ごとに、そのデータ型のすべてのエイリアスにルールが適用されます(例: FLOAT のルールは、 FLOAT のエイリアスである DOUBLE に適用されます)。
使用上の注意¶
特に明記されていない限り、明示的なキャストと暗黙的なキャストの両方に次のルールが適用されます。
変換はデータ型のみではなく、ソースの値にも依存します。例:
VARCHAR 値
'123'
は数値に変換できますが、 VARCHAR 値'xyz'
は数値に変換できません。VARIANT 型の特定の値をキャストできるかどうかは、 VARIANT 内部 のデータのタイプに依存します。たとえば、 VARIANT に TIME 型の値が含まれている場合は、 VARIANT 値を TIMESTAMP 値にキャストすることはできません。 TIME 値を 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 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 などの一部のアプリケーションプログラム、および Classic Console などの一部のグラフィカルユーザーインターフェイスは、データを表示するときに独自の変換およびフォーマットルールを適用します。たとえば、 SnowSQL は、 BINARY の値を16進数のみが含まれる文字列として表示します。その文字列は、変換関数を暗黙的に呼び出すことによって生成されます。したがって、 SnowSQL が表示するデータは、Snowflakeがどのデータ変換を強制したかを明確に示していない可能性があります。