小编Gra*_*ace的帖子

正确将Postgres minimum()行为迁移到BigQuery

我正在尝试将postgres脚本迁移到bigquery,最终目的是两个脚本都返回完全相同的表(模式和值)。

尝试在我的bigquery select中复制postgres中的minimum()行为时遇到问题。

在postgres中,如果minimum()调用的任何参数为null,则将跳过它们并返回最小非null值。但是,在bigquery中,如果minimum()调用的任何参数为null,则该函数自动返回null。

我正在寻找一种优雅的解决方案来复制bigquery中的postgres minimum()行为。我当前的笨拙解决方案如下:

Postgres(返回-1):

SELECT LEAST(1, 0, -1, null)
Run Code Online (Sandbox Code Playgroud)

BigQuery(返回null):

SELECT LEAST(1, 0, -1, null)
Run Code Online (Sandbox Code Playgroud)

Postgres(返回-1):

SELECT LEAST(COALESCE(1, 0, -1, null),
             COALESCE(0, 1, -1, null),
             COALESCE(-1, 0, 1, null),
             COALESCE(null, 0, -1, 1))
Run Code Online (Sandbox Code Playgroud)

BigQuery(返回-1):

SELECT LEAST(COALESCE(1, 0, -1, null),
             COALESCE(0, 1, -1, null),
             COALESCE(-1, 0, 1, null),
             COALESCE(null, 0, -1, 1))
Run Code Online (Sandbox Code Playgroud)

这是可行的,但不是理想的解决方案。

在我需要迁移的原始postgres脚本中,存在嵌套的逻辑,例如least(w, x, least(y, z)),随着值/复杂度的增长,修复变得指数级地不可读。当您尝试将其作为一个巨大的CASE块时,也会遇到相同的问题。

如果有人能找到我所缺少的明显修补程序,或者以更优雅的方式来反映bigquery中的postgres行为,我们将不胜感激!

sql postgresql google-bigquery google-cloud-platform

2
推荐指数
3
解决办法
283
查看次数