Snowflake の SQL Tips

2025年1月26日 engineering

こんにちは、 @kz_morita です。

Snowflake の SQL を書いてる時に、調べて便利だった Tips をまとめます。

EQUAL_NULL

Snowflake では、= 演算子で値を比較できますが値が null の場合は結果も null になります。 null どうしなどを比較したい場合は、EQUAL_NULL 関数が便利です。

select 
    'hoge' = 'hoge'
    , 'hoge' = null
    , null = 'hoge'
    , null = null
    , equal_null('hoge', 'hoge')
    , equal_null('hoge', null)
    , equal_null(null, 'hoge')
    , equal_null(null, null)
    

結果は以下のようになります。

‘HOGE’ = ‘HOGE’ ‘HOGE’ = NULL NULL = ‘HOGE’ NULL = NULL EQUAL_NULL(‘HOGE’, ‘HOGE’) EQUAL_NULL(‘HOGE’, NULL) EQUAL_NULL(NULL, ‘HOGE’) EQUAL_NULL(NULL, NULL)
TRUE null null null TRUE FALSE FALSE TRUE

null どうしの比較などを行うことができます。

ARRAY_UNIQUE_AGG

ARRAY_AGG 関数を使うと、グループ化した結果を配列で取得できますが、重複を取り除く ARRAY_UNIQUE_AGG 関数が便利です。

select
    group_key
    , array_agg(value) as non_unique_arr
    , array_distinct(array_agg(value)) as unique_arr
    , arrray_unique_agg(value) as unique_arr2
from table_name
group by 1

今まで ARRAY_UNIQUE_AGG 関数は存在を知らなかったので、ARRAY_DISTINCT も使っていましたがこちらの方が便利です。

TRANSFORM, REDUCE

いわゆる、map と reduce 関数です。

これらの関数があると大体の配列処理が書けるので覚えておくと便利です。

(例は後ほど)

MAP_CAT

Snowflake には Key Value の Map 型がありますが、MAP_CAT 関数を使うと、Map どうしを連結することができます。

前述の TRANSFORM, REDUCE と組み合わせると、URL のクエリパラメータをパースする処理が書けます。

select
    'https://example.com?hoge=1&fuga=2' as url
    , reduce(
        transform(
            -- ? で分割した後半部分を & で分割
            split(split(url, '?')[1], '&') 
            -- a=1 などの文字列を = で分割し OBJECT 型にする
            -- & で分割した配列のそれぞれの部分に対して処理を行うため transform
            , a VARCHAR -> object_construct(to_varchar(split(a, '=')[0]), split(a, '=')[1])
        )
        , {}::map(varchar, varchar)
        -- map_cat で map 同士を連結
        , (m1, m2) -> map_cat(m1, m2::map(varchar, varchar))
    ) as parsed
    , parsed['hoge'] as hoge -- => 1
    , parsed['fuga'] as hoge -- => 2

まとめ

今回は最近お世話になった、Snowflake の SQL の Tips をまとめました。 Snowflake 自体は 1年使ってましたが新しく知ることがありました。これらをつかうと便利に SQL が書けそうで良さそうです。

この記事をシェア