我正在尝试将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行为,我们将不胜感激!