You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:45:27