You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对REPEATED模式的RECORD字段使用WHERE子句执行查询

报错原因

你写的语句无法运行核心是因为attributes是REPEATED模式的RECORD,本质是数组类型,你直接写data.attributes.key拿到的是所有数组元素的key组成的集合,没法直接和单个字符串做等值判断,也没法直接判断对应value是否为空。

正确实现

方案1:保留原表行结构,无需展开数组(推荐,性能更好)

用EXISTS子句判断数组中是否存在符合条件的元素即可:

SELECT *
FROM `tablename`
WHERE 
  data.createdAt >= "2021-08-13 10:44:00.000 UTC"
  AND EXISTS (
    SELECT 1 
    FROM UNNEST(data.attributes) AS attr
    WHERE attr.key = "key name"
    AND attr.value IS NULL
  )

这个写法不会改变原表的行结构,一行只要有至少一个符合要求的attributes元素就会被返回一次,不会出现多行重复的问题。

方案2:展开数组返回匹配的属性内容

如果你需要同时拿到符合条件的那个attributes元素的具体内容,可以用UNNEST和隐式JOIN实现:

SELECT t.*, matched_attr
FROM `tablename` t,
UNNEST(t.data.attributes) AS matched_attr
WHERE 
  t.data.createdAt >= "2021-08-13 10:44:00.000 UTC"
  AND matched_attr.key = "key name"
  AND matched_attr.value IS NULL

注意:如果一行数据里有多个符合条件的attributes元素,这个写法会把一行拆成多行返回,每一行对应一个匹配的元素,如果需要去重可以在SELECT后加DISTINCT。

可选优化

因为data是NULLABLE的RECORD,如果你要过滤掉data为null的行,可以在WHERE条件里加AND data IS NOT NULL,避免无效判断。

内容的提问来源于stack exchange,提问作者Akinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:09:02