如何对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
相关产品推荐
相关产品推荐

