Google BigQuery连接含Record嵌套字段的PostgreSQL表报错问询
报错原因
你遇到的报错是关联条件两侧的字段类型不匹配导致的:
PostgreSQL的Record类型字段迁移到BigQuery后会被映射为ARRAY<STRUCT>(数组嵌套结构体)类型,Orders.options_id本质是一组结构体的集合,并非单个数值。你直接用整个数组字段和Options.id这个单值字段做等值匹配,BigQuery无法识别该判断逻辑,因此抛出错误。
解决方案
根据业务场景可以选择以下两种常用处理方案:
- 方案1:打散数组后关联(适用于需要保留订单与关联option的一一对应关系的场景)
通过UNNEST函数将options_id的数组拆分为单行的结构体数据,再取出结构体中存储id的字段与Options.id做关联,示例SQL如下:
SELECT orders.*, options.Name_of_Option FROM Orders orders, -- 打散options_id数组,得到单行的结构体值 UNNEST(orders.options_id) AS option_struct JOIN Options options -- 替换value为你STRUCT中实际存储option id的字段名 ON option_struct.value = options.id
- 方案2:元素级判断关联(适用于不需要拆分订单行,仅做匹配校验、筛选的场景)
如果不需要输出关联的option信息,只需要筛选出关联了指定option的订单,可以用EXISTS做元素级匹配,示例SQL如下:
SELECT orders.* FROM Orders orders WHERE EXISTS ( SELECT 1 FROM Options options WHERE options.id IN ( SELECT struct.value FROM UNNEST(orders.options_id) struct ) )
内容的提问来源于stack exchange,提问作者Tomás de Marcos
相关产品推荐
相关产品推荐

