如何编写Presto查询以查找行数组中指定sku元素的索引位置
Presto查询sku在product数组中位置的实现方案
你可以根据业务需求选择以下两种实现方式:
方案1:单行返回第一个匹配位置(适用数组内sku不重复的场景)
先用transform提取数组内所有行的productsku字段,再用array_position匹配位置,Presto数组下标默认从1开始:
SELECT sku, product, -- 如果需要0开头的下标,直接在结果后减1即可 array_position(transform(product, item -> item.productsku), sku) AS product_list_position FROM 你的表名;
说明:如果当前sku不存在于product数组中,product_list_position返回null。
方案2:返回所有匹配位置(适用数组内可能有多个相同sku的场景)
用带ORDINALITY的UNNEST拆解数组同时获取下标,过滤出匹配的位置即可:
SELECT t.sku, t.product, pos AS product_list_position, -- 可以按需取匹配到的product行的其他字段 p.product_row.title AS matched_product_title FROM 你的表名 t -- 如果需要保留sku不存在的行,把CROSS JOIN改成LEFT JOIN CROSS JOIN UNNEST(t.product) WITH ORDINALITY AS p(product_row, pos) WHERE p.product_row.productsku = t.sku;
说明:如果同一个sku在product数组中出现多次,会返回多行对应每个匹配位置。
注意事项
- 所有返回的位置默认从1开始计数,需要0起始的直接对返回的位置值减1即可
- 如果product数组可能为空,方案1会直接返回null,方案2如果用LEFT JOIN会返回位置为null的行
内容的提问来源于stack exchange,提问作者Charles H Martin PhD
相关产品推荐
相关产品推荐

