SnowPro Advanced: Data Engineer 無料問題 9 / 10 ・ 分野5: Data Transformation
VARIANT 列 src の要素 middle_name が、ある行では JSON の null、別の行では要素ごと欠けている。WHERE src:middle_name IS NULL で絞ると、JSON の null の行が結果に入らない。JSON の null の行も SQL の NULL として扱うには、どう書くのが公式の説明に合うか。
- src:middle_name::variant のように VARIANT へキャストしてから IS NULL で比べる
- FLATTEN の OUTER => TRUE で展開してから、VALUE を IS NULL で比べる
- GET_PATH(src, 'middle_name') で取り出してから IS NULL で比べる
- src:middle_name::string のように文字列へキャストしてから IS NULL で比べる
正解と解説を見る
正解: D
正解の理由
半構造化のデータには2種類の NULL がある。SQL の NULL は値が無い・分からないことを表し、要素ごと欠けている行はこれになる。JSON の null(VARIANT NULL)は、VARIANT の列では単語 null を含む文字列として保存され、SQL の NULL と区別される。そのため IS NULL は JSON の null を拾わない。公式は、JSON の null を SQL の NULL に直すには文字列としてキャストするよう書いている(TO_VARCHAR などでもよい)。
違う選択肢
「GET_PATH(src, 'middle_name') で取り出してから IS NULL で比べる」… GET_PATH はコロンのパスの書き方と同じ働きの関数で、取り出した値は VARIANT の JSON の null のままである。IS NULL は真にならない。
「src:middle_name::variant のように VARIANT へキャストしてから IS NULL で比べる」… VARIANT へのキャストでは型が変わらず、JSON の null は JSON の null のまま残る。SQL の NULL に直すのは文字列へのキャストである。
「FLATTEN の OUTER => TRUE で展開してから、VALUE を IS NULL で比べる」… OUTER => TRUE は、展開できない入力行について KEY・INDEX・VALUE を NULL にした1行を出す指定で、スカラーの要素の JSON の null を SQL の NULL に直すものではない。
配列の場合
ARRAY を作るときに SQL の NULL と JSON の null を要素に混ぜると、SQL の NULL は undefined の要素、JSON の null は null の要素として出る。どちらの NULL が入っているかで、後段の関数の結果が変わる。