PostgreSQL复杂JSON列查询:筛选Legs中SLocation与ELocation相等的行
解决方案
方法1:通过数组展开+关联筛选
使用json_array_elements把Legs数组拆成单个元素,检查每个元素的SLocation和ELocation是否相等,最后关联原表并去重(避免同一行因多个符合条件的Legs元素被重复返回):
SELECT DISTINCT si.* FROM public.shipping_instruction si JOIN json_array_elements(si.payload->'Legs') AS leg ON leg->>'SLocation' = leg->>'ELocation';
方法2:使用EXISTS子查询(更高效)
用子查询判断当前行的Legs数组中是否存在符合条件的元素,无需额外去重,性能更优:
SELECT * FROM public.shipping_instruction si WHERE EXISTS ( SELECT 1 FROM json_array_elements(si.payload->'Legs') AS leg WHERE leg->>'SLocation' = leg->>'ELocation' );
针对jsonb类型的调整
如果你的Payload列是jsonb类型(推荐使用,查询性能更好),只需把json_array_elements替换为jsonb_array_elements:
SELECT * FROM public.shipping_instruction si WHERE EXISTS ( SELECT 1 FROM jsonb_array_elements(si.payload->'Legs') AS leg WHERE leg->>'SLocation' = leg->>'ELocation' );
关键说明
- 必须用
->>操作符提取文本值来做相等比较,用->得到的是JSON类型,无法直接用=判断相等。 - EXISTS子查询的效率更高,因为找到第一个符合条件的Legs元素后就会停止检查当前行的其他元素。
内容的提问来源于stack exchange,提问作者ladsaylee
相关产品推荐
相关产品推荐

