GCP中使用UNNEST筛选iOS订单的SQL查询问题
问题分析与解决方案
你写的SQL语句存在错误,原因是UNNEST(parameters)展开后得到的每条记录是包含name和stringValue的结构体,不存在device字段,所以p.device = 'ios'这个条件无法匹配到数据。
正确实现方式
1. 获取设备为iOS的订单及对应参数行
如果只需要提取符合条件的订单,以及对应的参数条目,可使用以下语句:
SELECT * FROM `your-project.your-dataset.table` CROSS JOIN UNNEST(parameters) AS p WHERE p.name = 'device' AND p.stringValue = 'ios'
注:CROSS JOIN UNNEST和你原语句的逗号写法功能等价,但可读性更强。
2. 获取完整订单数据(包含该订单所有参数)
如果需要保留整个订单的全部参数信息(比如订单1的country、price、device参数都保留),可以用两种方式实现:
方法一:使用EXISTS子查询
SELECT * FROM `your-project.your-dataset.table` t WHERE EXISTS ( SELECT 1 FROM UNNEST(t.parameters) p WHERE p.name = 'device' AND p.stringValue = 'ios' )
方法二:结合ARRAY_FILTER保留完整参数数组
如果要过滤出设备为iOS的订单,同时保留该订单的所有参数:
SELECT order_no, ARRAY(SELECT AS STRUCT * FROM UNNEST(parameters)) AS parameters FROM `your-project.your-dataset.table` WHERE EXISTS ( SELECT 1 FROM UNNEST(parameters) p WHERE p.name = 'device' AND p.stringValue = 'ios' )
内容的提问来源于stack exchange,提问作者sadvsdcasd
相关产品推荐
相关产品推荐

