如何使用jq基于另一筛选结果过滤JSON文档元素?
用jq实现类似SQL IN子查询的筛选需求
原始JSON数据
[ {"id": 1, "ref":32, "key":10}, {"id": 2, "ref":32, "key":75}, {"id": 3, "ref":27, "key":13}, {"id": 4, "ref":27, "key":42}, {"id": 5, "ref":438, "key":42} ]
需求说明
需要筛选出所有ref值属于「key等于42的元素的ref值集合」的元素,对应SQL逻辑:
select * from table where ref in (select ref from table where key = 42)
一、动态匹配key=42对应的ref集合
你已经成功得到目标ref数组:[.[]|select(.key==42).ref],只需要将这个数组存为变量,再用jq内置的IN函数判断元素的ref是否在该集合中即可:
(.[]|select(.key==42).ref) as $target_refs | .[] | select(.ref | IN($target_refs[]))
执行结果:
{"id":3,"ref":27,"key":13} {"id":4,"ref":27,"key":42} {"id":5,"ref":438,"key":42}
二、匹配硬编码的ref列表
如果要筛选ref在指定硬编码列表(比如[32,45])中的元素,直接用IN函数传入列表元素就行:
.[] | select(.ref | IN(32,45))
针对示例JSON的执行结果:
{"id":1,"ref":32,"key":10} {"id":2,"ref":32,"key":75}
也可以把硬编码列表存为变量,让代码更易读:
[32,45] as $target_refs | .[] | select(.ref | IN($target_refs[]))
内容的提问来源于stack exchange,提问作者Miserable Variable
相关产品推荐
相关产品推荐

