在以下最小示例中,
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
)?
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 值的宝贵工具,但如果您的应用程序逻辑依赖于它们的存在,请谨慎使用它们。仔细考虑您的数据要求并选择最适合您需求的方法。