読者です 読者をやめる 読者になる 読者になる

カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

BigQuery脱初心者を目指せ!今から覚えるべきテクニック3つ

CASEやJOIN、GROUP BYなども覚えて、SQLは大体大丈夫!となっている方も多いかもしれません。

しかし、BigQueryに触れるなら、もうちょっと覚えておいた方が楽になることが色々あります。

ので、覚えてみましょうと言う話。3つで十分なのかという声もあるでしょうが、ネタが出てこないので、3つで許してください。

1. TABLE_DATE_RANGE()

TABLE_DATE_RANGE() で、複数テーブルからフェッチ。

SELECT
  id
FROM
TABLE_DATE_RANGE([foo_dataset.], TIMESTAMP('2015-09-10'), TIMESTAMP('2016-06-15'))

ちなみに、 [] 使えば、テーブル名が日付だけでも大丈夫です。 それがないと、こんなエラーになるので、気をつけてください。

Encountered " "TIMESTAMP" "TIMESTAMP "" at line 5, column 51. Was expecting: ")" ...

2. JSON_EXTRACT_SCALAR()

JSON_EXTRACT_SCALAR() を使ってJSONを操ることができるので、やってみましょう。

こんな風にフェッチできます。

SELECT 
  JSON_EXTRACT_SCALAR('{"a": ["x", {"b": "foo"}]}', '$.a[1].b') AS str

結果はこんな感じ。a配列の1番目のキーbの値を取るということですね。

Row  str  
1   foo

ちなみに、JSON_EXTRACT() というのはありますが、その場合は以下のように返ってきます。

Row  str  
1   "foo"

ダブルクォートも一緒に文字列として返してしまうので、よほどのことがない限りはJSON_EXTRACT_SCALAR() のほうがよいでしょう。

もちろん、WHERE句でも使えますので、駆使できるとよいでしょうね。

3. CONTAINS

最後に CONTAINS 。上の項目でJSONをパースする方法をお伝えしましたが、BigQueryには、LIKE以外にも CONTAINS というのがあります。

こんな感じ。

SELECT
*
FROM dataset.table
WHERE sample_json CONTAINS "some_key"

正直、以下と何が違うのかはわからない。

SELECT
*
FROM dataset.table
WHERE sample_json LIKE "%some_key%"

まぁ、絞り込みができます。

ただ、JSONを対象にして、 CONTAINS を使いたい場合、もしキーが存在しているかどうかだけを見たいなら、以下の方がいいかも。

SELECT
*
FROM dataset.table
WHERE JSON_EXTRACT_SCALAR(sample_json, '$.a[1].some_key') IS NOT NULL

こうすることで、確実に some_key があるデータだけを抽出できます。

終わりに

簡単に書いてみましたが、いかがだったでしょうか。

BigQueryはもう何年も使っているのですが、未だに新たな発見があり、覚えることが非常に多くありますね。

その分便利だとは思いますので、是非みなさんも覚えてみましょう!

これ便利だよとかあれば是非教えて下さい!ではでは!