<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>JSON on Think and Write</title><link>https://kenjiusui.github.io/blog/tags/json/</link><description>Recent content in JSON on Think and Write</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Wed, 07 Dec 2022 11:30:18 +0900</lastBuildDate><atom:link href="https://kenjiusui.github.io/blog/tags/json/index.xml" rel="self" type="application/rss+xml"/><item><title>BigQueryでJSONの配列から行に変換する</title><link>https://kenjiusui.github.io/blog/posts/biz/004_bigquery%E3%81%A7json%E3%81%AE%E9%85%8D%E5%88%97%E3%81%8B%E3%82%89%E8%A1%8C%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B/</link><pubDate>Wed, 07 Dec 2022 11:30:18 +0900</pubDate><guid>https://kenjiusui.github.io/blog/posts/biz/004_bigquery%E3%81%A7json%E3%81%AE%E9%85%8D%E5%88%97%E3%81%8B%E3%82%89%E8%A1%8C%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;valueに配列を含むJSONから配列を抽出し行へ変換するクエリの書き方&lt;/p&gt;
&lt;h1 id="前提"&gt;前提&lt;/h1&gt;
&lt;p&gt;下記のようなJSONが &amp;ldquo;テーブル名：table_1&amp;rdquo; の &amp;ldquo;列名：item_logs&amp;rdquo; に格納されいてるとき&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{
&amp;#34;user_id&amp;#34;: 1111,
&amp;#34;item_names&amp;#34;: [
&amp;#34;foo&amp;#34;,
&amp;#34;bar&amp;#34;,
&amp;#34;hoge&amp;#34;
]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このようなテーブルに変換するためのクエリ&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;user_id&lt;/th&gt;
&lt;th&gt;item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1111&lt;/td&gt;
&lt;td&gt;foo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1111&lt;/td&gt;
&lt;td&gt;bar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1111&lt;/td&gt;
&lt;td&gt;hoge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;環境はBigQuery&lt;/p&gt;
&lt;h1 id="書き方"&gt;書き方&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;json_query_arrayでほしい配列が格納されているペアのkey &amp;ldquo;$.item_names&amp;rdquo; を指定し目的の配列をとってくる&lt;/li&gt;
&lt;li&gt;unnestで配列を行に変換する（配列の順序が保証されないらしいので必要ならoffsetを使う）&lt;/li&gt;
&lt;li&gt;上記で行に変換したものと元のテーブルをcross joinして目的のテーブルが完成&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;select
user_id,
json_value(items) as item,
from
table_1 as t_1
cross join
unnest(json_query_array(t_1.item_logs, &amp;#34;$.item_names&amp;#34;)) as items
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これを使ってJSONから &lt;code&gt;item = &amp;quot;foo&amp;quot;&lt;/code&gt; のときだけフラグを建てる処理も簡単に書ける。&lt;br&gt;
JSON値は比較とかできないのでjson_valueで変換する。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;select
id,
json_value(items) = &amp;#34;foo&amp;#34; as is_foo,
from
table_1 as t_1
cross join
unnest(json_query_array(t_1.item_logs, &amp;#34;$.item_names&amp;#34;)) as items
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;変更があったり間違っていたらコメントください。&lt;/p&gt;</description></item></channel></rss>