横に長いkey,valueを格納する
もうね、あるあるなんですよ。列でkey,valueになっちゃってるやつ。
しかも規則なくただ単に突っ込まれているようなもの。たとえばこんなの。
(今回はサンプルで3つだけど、これが300とかあると地獄)
uuid | key_1 | value_1 | key_2 | value_2 | key_3 | value_3 |
---|---|---|---|---|---|---|
鮭おにぎり | 素材 | 鮭 | 重さ | 200g | 製造者 | おれ |
梅おにぎり | 重さ | 300g | 素材 | 梅 | 素材製造者 | おふくろ |
こんなもん、どこに何があるかわかるかい!ってなるわけですよ。
key_1にはこういう値をいれましょうねぇって誰も守らない。
で、そういうのをうまくkey,valueに出来ないもんかと。
そんなクエリ。
array_struct.sql
select
uuid,
[
struct(key_1 as key_name,value_1 as col_value), --ここはスプレッドシートなりでうまく作っちゃう
struct(key_2 as key_name,value_2 as col_value),
struct(key_3 as key_name,value_3 as col_value)
] as key_value
from
table_name
で、これがどうなるかというと、こうなる
uuid | key_value.key_name | key_value.col_value |
---|---|---|
鮭おにぎり | 素材 | 鮭 |
重さ | 200g | |
製造者 | おれ | |
梅おにぎり | 重さ | 300g |
素材 | 梅 | |
素材製造者 | おふくろ |
でも、ここで"重さ"だけを出したいとします。
先程のクエリをwith句に入れちゃうとこうなります。
(こういうのはテーブルにするほうが後々便利に使えることもあるので、テーブルにしちゃうのもアリだと思います)
unnest.sql
with info as (
select
uuid,
[
struct(key_1 as key_name,value_1 as col_value), --ここはスプレッドシートなりでうまく作っちゃう
struct(key_2 as key_name,value_2 as col_value),
struct(key_3 as key_name,value_3 as col_value)
] as key_value
from
table_name
)
select
uuid,
kv.key_name,
kv.col_value
from
info,unnest(key_value) as kv
where
kv.key_name = "重さ"
で、結果はこうなります。
uuid | key_name | kcol_value |
---|---|---|
鮭おにぎり | 重さ | 200g |
梅おにぎり | 重さ | 300g |
はい。出来ました。
こんなことあるかい!うちのマスタはきれいなもんだぜ!って言ってるそこのあなたにお届けします。おるんかどうかしらんけど。