2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

横に長いkey,valueを格納する

Last updated at Posted at 2024-04-02

横に長い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

はい。出来ました。
こんなことあるかい!うちのマスタはきれいなもんだぜ!って言ってるそこのあなたにお届けします。おるんかどうかしらんけど。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?