检查 Postgres 中 JSONB 字段的数组内的对象中是否存在属性

eaw*_*wer 3 postgresql

这是我的表数据:

对应的sqlfiddle - http://sqlfiddle.com/#!17/e3f09

create table jsonData (
    id serial primary key,
    data jsonb
);

insert into jsonData (data) values (

$${
  "b": 2,
  "c": [
    {
      "d": {
        "e": true
      }
    },
    {
      "d": {
        "e": true
      }
    },
    {
      "d": {
        "e": true,
        "f": "I'm here"
      }
    }
  ]
}
$$::jsonb),
(
$${
  "a": 1,
  "c": [
    {
      "d": {
        "e": true
      }
    },
    {
      "d": {
        "e": true
      }
    },
    {
      "d": {
        "e": true
      }
    }
  ]
}$$::jsonb);
Run Code Online (Sandbox Code Playgroud)

问题是 - 如何选择存在“f”属性(路径在任何地方都相同 - 'c -> d -> f')存在的所有记录?

sti*_*bit 9

使用 anEXISTSjsonb_array_elements()获取数组的元素并->'d'->'f'检查NULL.

SELECT * 
       FROM jsonData
       WHERE EXISTS (SELECT *
                            FROM jsonb_array_elements(data->'c')
                            WHERE value->'d'->'f' IS NOT NULL);
Run Code Online (Sandbox Code Playgroud)

SQL小提琴