今回はデータ型を変えてくれるCAST関数について解説する。
標準SQLに準拠しているGoogle Big Queryを基準として説明するので、MySQL等の他のRDMS(リレーショナルデータベース)を使用している場合は多少異なる点が出てくるのはご了承いただきたい。
CAST関数とは?
CAST関数とはデータの型変換を行う関数だ。
例えば、下記SampleStoreテーブルのidフィールドはデフォルトが文字列型(STRING)だ。
このIdのデータ型を「整数型(INT64)に変更したい」という時などにCAST関数は便利だ。
1 2 3 4 5 | SELECT id ,CAST(id AS INT64) AS id_int FROM `SampleStore` ; |
上記クエリを実行した結果は下記だ。
上記では違いが分かりやすいように元の文字列型のidとCAST関数でidフィールドのデータ型を整数型に変えたid_intフィールドを左右に表示させている。
id_intの方は整数型になっているので、文字列型だと表記可能な先頭の0000が表示されなくなっているのがお分かりいただけると思う。
CAST関数はこのようにあるフィールドのデータ型を適切な型に変換したい時に便利だ。
なぜデータ型の変換が必要なのか?
データ型の変換が必要な理由はデータ型が適切でないと下記のようなことが起きるからだ。
- データ型に合わないデータをテーブルに登録するとエラーが生じる
- 本来集計を行いたいフィールドが文字列型になっている場合、合計したり、平均したりすることが出来ない(数値型なら出来る)
- 日付の計算をしたいのに文字列型になっているため日付関数が使用できない(日付型なら使用できる)
こういう時のためにCAST関数等を使用して適切なデータ型へ変換しておく必要があるのだ。
もちろん、全てのフィールドが適切なデータ型ならCAST関数等でデータ型を変換する必要はないが、そんなデータはあまり無いだろう。
CAST関数の使い方
CAST関数の使い方は下記の通りだ。
データ型を変更したいフィールドもしくは値を指定し、どのデータ型に変換するかをAS以降で指定するだけだ。
具体的に先ほどの例を当てはめてみると下記のようになる。
使い方は比較的簡単だろう。
ちなみにtypenameに当てはめることができるデータ型の種類は対象のフィールドや値のデータ型に応じて決まっているので注意が必要だ。
例えば、下記の文字列をDATE型に変換しようとすると型変換が出来ず、エラーとなってクエリが失敗する。
「テスト」という文字列がサポートされている日付のリテラル形式に従っていないためだ。
1 2 3 4 | SELECT CAST('テスト' AS DATE) AS test_date FROM `SampleStore` ; |
どのデータ型や値からどのデータ型に変換できるかは下記のBigQueryのリファレンスを参考にして欲しい。
https://cloud.google.com/bigquery/docs/reference/standard-sql/conversion_functions?hl=ja#cast
SAFE_CAST関数との違い
CAST関数と似ているのがSAFE_CAST関数だ。
このSAFE_CAST関数はCAST関数とほぼ同じ働きをしてくれる関数だ。
つまり、対象のフィールドや値のデータ型を指定したデータ型に変換してくれる。
ただ1点だけCAST関数と違いがあるのが、エラーになった場合の処理だ。
CAST関数の場合、例えば、先ほどの例の下記クエリの場合、CAST関数で実行すると下記のようにエラーとなってクエリが失敗してしまう。
1 2 3 4 | SELECT CAST('テスト' AS DATE) AS test_date FROM `SampleStore` ; |
一方で下記のようにCAST関数の代わりにSAFE_CAST関数を使用すると、エラーの代わりに対象のフィールドの値をNULLとして返してくれるのでクエリの実行が可能となる。
1 2 3 4 | SELECT SAFE_CAST('テスト' AS DATE) AS test_date FROM `SampleStore` ; |
SAFE_CASTのSAFEは「エラーからクエリを守る」という意味のSAFEだとイメージしておくと整理しやすいのではないかと思う。
まとめ
今回はデータ型を変更してくれるCAST関数を紹介した。
本記事の要点は下記だ。
- CAST関数はデータ型を変換してくれる関数
- 適切なデータ型でないと集計ができなかったり、使用したい関数が使用できない
- CAST関数で変換できるデータ型の種類は対象のフィールドデータ型や値によって決まる
- SAFE_CAST関数はデータ型の変換ができない場合にエラーの代わりに対象のフィールドの値をNULLとして返してくれる