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,这种情况根本不会出现。