Snowflake SQL フォーマッター
Snowflake のクエリを貼り付ければ、きれいで読みやすい SQL が得られます。QUALIFY、FLATTEN、VARIANT のパスアクセスといった Snowflake 固有の構文は保持され、:name バインド変数はパラメーターとして検出されます。
Snowflake のクエリ、整形前と整形後
下の未整形のクエリは、上のエディタに読み込まれているサンプルそのものです。出力はデフォルト設定でこのフォーマッターが返す内容そのままで、手作業で整えた箇所はありません。
WITH ranked AS (SELECT customer_id, order_id, total, src:shipping.country::string AS country, row_number() OVER (PARTITION BY customer_id ORDER BY total DESC) AS rn FROM orders WHERE order_ts >= :start_date AND region = :region) SELECT customer_id, order_id, total, country FROM ranked WHERE rn = 1 AND total > :min_total QUALIFY row_number() OVER (ORDER BY total DESC) <= 100 ORDER BY total DESC WITH
ranked AS (
SELECT
customer_id,
order_id,
total,
src:shipping.country::STRING AS country,
row_number() OVER (
PARTITION BY
customer_id
ORDER BY
total DESC
) AS rn
FROM
orders
WHERE
order_ts >=:start_date
AND region =:region
)
SELECT
customer_id,
order_id,
total,
country
FROM
ranked
WHERE
rn = 1
AND total >:min_total
QUALIFY
row_number() OVER (
ORDER BY
total DESC
) <= 100
ORDER BY
total DESC 対応している Snowflake の構文
汎用のフォーマッターは方言固有の構文を壊すか、そもそも受け付けません。ここに挙げるのは、このフォーマッターがテストで確認している Snowflake の構文です。
QUALIFY 句の境界として認識されるため、WHERE を編集してもそこを越えて広がることはありません。
src:path.to.field VARIANT のパスアクセスは保持され、:name バインド変数と取り違えられることはありません。
:name バインド変数は検出され、入力可能なパラメーターとしてグループ化されます。
LATERAL FLATTEN(...) 半構造化データの展開は句の形を保ちます。
Snowflake フォーマッターのよくある質問
QUALIFY に対応していますか?
はい。QUALIFY は正式な句として扱われるため正しく整形され、編集中の WHERE 句はその手前で終わります。
VARIANT のパスがバインド変数と混同されませんか?
半構造化データへのコロンによるパスは式の一部として扱われるため、通常の VARIANT アクセスがパラメーターとして報告されることはありません。
1 つの CTE の WHERE 句だけを編集できますか?
はい。クエリ内のすべての WHERE は、それを含む CTE ごとに一覧表示されます。多段構成の Snowflake クエリでは段ごとに 1 項目が並び、1 つを編集しても新しい条件はその句だけに差し戻され、クエリの他の部分は動きません。
LATERAL FLATTEN は整形後も壊れませんか?
はい。LATERAL FLATTEN の呼び出しは、FROM の中の普通の関数のように折り返されるのではなく、句としての形と名前付き引数の矢印を保ちます。そのため半構造化データの展開も読みやすいままです。
Snowflake のクエリを最小化できますか?
はい。整形と最小化のどちらも使えます。最小化は文字列リテラルをバイト単位でそのまま残すため、ストアドプロシージャやタスク定義に戻すクエリのように、リテラルが変わると挙動が変わる場面でも安心です。
Snowflake Scripting のブロックはどうなりますか?
中の SQL 文は通常どおり整形され、BEGIN と END による制御フローはクエリ構文としてインデントし直さず、そのまま通します。このページで通常扱う単一の SELECT では、そもそも問題になりません。