如何创建两个具有部分可为空列的表的并集

问题描述 投票:0回答:1

在以下最小示例中,

foo
是表
STRING
中的
a
。在表
b
中,它是
NULL

WITH
  a AS (
  SELECT
    "ax" AS x,
    "bla" AS foo),

  b AS (
  SELECT
    "bx" AS x,
    NULL AS foo)

SELECT * FROM a
UNION ALL
SELECT * FROM b

BigQuery 将

foo
中的
b
的类型派生为
INT64
,因此查询失败:

Column 2 in UNION ALL has incompatible types: STRING, INT64 at [14:1]

当然,在这个最小的示例中,可以将

NULL AS foo
替换为
CAST(NULL AS STRING) AS foo)
,以使其正常工作。

但在我的实际应用中,要合并的表的模式非常复杂(多个嵌套结构等),如果有一个解决方案不需要我将每个

NULL
转换为类型,那就太好了。有没有办法让
foo
中的
b
类型保持打开状态,以便在
STRING
发生时专门处理所需的任何内容(在这种情况下为
UNION ALL
)?

sql google-bigquery
1个回答
0
投票

BigQuery 不直接支持在 UNION ALL 中打开列类型以进行自动类型推断。

COALESCE 函数允许您指定在第一个表达式为 NULL 时返回的默认值。

WITH
  a AS (
  SELECT
    "ax" AS x,
    "bla" AS foo),

  b AS (
  SELECT
    "bx" AS x,
    COALESCE(foo, "") AS foo)  -- Replace NULL with empty string

SELECT * FROM a
UNION ALL
SELECT * FROM b

或者

WITH
  a AS (
  SELECT
    "ax" AS x,
    "bla" AS foo),

  b AS (
  SELECT
    "bx" AS x,
    CASE WHEN foo IS NULL THEN "" ELSE foo END AS foo  -- Replace NULL with empty string
)

SELECT * FROM a
UNION ALL
SELECT * FROM b

虽然 COALESCE 和 CASE WHEN 是处理 NULL 值的宝贵工具,但如果您的应用程序逻辑依赖于它们的存在,请谨慎使用它们。仔细考虑您的数据要求并选择最适合您需求的方法。

© www.soinside.com 2019 - 2024. All rights reserved.