通过 jsonb 列中的给定键/值对过滤行

Posted

技术标签:

【中文标题】通过 jsonb 列中的给定键/值对过滤行【英文标题】:Filter rows by given key/value pair in a jsonb column 【发布时间】:2015-02-23 18:24:32 【问题描述】:

我在 Postgres 9.4 中有下一张表

CREATE TABLE public.neuro (
    nid int4 NOT NULL DEFAULT nextval('neuro_nid_seq'::regclass),
    data jsonb,
    CONSTRAINT neuro_pkey PRIMARY KEY (nid) NOT DEFERRABLE INITIALLY IMMEDIATE
);

与记录:

"item2": "1": "0", "uid": "0", "nota": "weqcqwe qwe wq", "fecha": "23-02-2015", "examen": "aesc", "puntaje": "0", "paciente": "103636426"
"item2": "1": "0", "uid": "0", "nota": "text", "fecha": "23-02-2015", "examen": "aesc", "puntaje": "0", "paciente": "103636426"
"item3": "1": "3", "2": "1", "3": "3", "uid": "0", "fecha": "23-02-2015", "examen": "fab", "puntaje": "7", "paciente": "103636426"
...

如何选择examen ='aesc'的所有记录?我尝试使用运算符->>@。如何以相同的方式选择某些字段?我需要在 JSON 列中维护初始的“itemX”。

【问题讨论】:

通过您的数据设置,我不太确定一个非常有效的方法——但是,您可以在 json 的文本表示中使用“like”... 您的 JSON 对象中有多少层嵌套? 【参考方案1】:

由于您的 JSON 对象似乎恰好嵌套在 一个 级别,您可以使用 jsonb_each() 取消嵌套一层并搜索动态键名的值部分(我们以这种方式忽略):

SELECT n.*
FROM   public.neuro n, jsonb_each(n.data) d
WHERE  d.value->>'examen' = 'aesc'

相关:

How to filter rows on nested values in a json column? How do I query using fields inside the new PostgreSQL JSON datatype?

【讨论】:

以上是关于通过 jsonb 列中的给定键/值对过滤行的主要内容,如果未能解决你的问题,请参考以下文章

从给定键值对的字典数组中过滤 NSDictionary

根据列中的条件对数据框中的行进行子集/过滤

根据 RECORD(repeated) 类型的列中不存在键来过滤 ROWs 列

通过多列中的值有效地在R中闪烁过滤数据帧

Redshift:基于键的分配是不是优化了相等过滤器?

在一个语句中从 jsonb 列中删除多个键