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 访问不会被报告为参数。
能只编辑某一个 CTE 的 WHERE 子句吗?
能。查询里的每个 WHERE 都按包含它的 CTE 列出,多步骤的 Snowflake 查询会为每一步给出一个条目。编辑其中一个时,新条件只会写回那个子句,查询里别的地方不会移动。
LATERAL FLATTEN 能扛过格式化吗?
能。LATERAL FLATTEN 调用会保持子句形态和具名参数的箭头写法,而不是像 FROM 列表里的普通函数那样被重新折行,半结构化数据的展开因此仍然易读。
能压缩 Snowflake 查询吗?
能。美化和压缩都提供,而且压缩会让字符串字面量逐字节保持不变——当查询要放回存储过程或任务定义里时这很关键,因为改动一个字面量就会改变行为。
Snowflake Scripting 的代码块怎么处理?
里面的 SQL 语句会正常格式化,而 BEGIN 和 END 这类脚本控制流会原样带过,不会被当成查询语法重新缩进。对于本页常见的单条 SELECT,这种情况根本不会出现。