选择在JSON数组中找到值的行

rqmkfv5c  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一个表uploads_table
| upload_id|价值|
| --------------|--------------|
| A| [{“doc_name”:“doc1a”,“doc_type”:“pdf”},{“doc_name”:“doc1b”,“doc_type”:“}]|
| B| [{“doc_name”:“doc2a”,“doc_type”:“csv”},{“doc_name”:“doc2b”,“doc_type”:“}]|
| C| [{“doc_name”:“doc3a”,“doc_type”:[PDF]|
什么是Postgres查询,以返回所有来自uploads_tableupload_id, value,其中至少有一个“doc_type”为“pdf”。
预期结果:
| upload_id|价值|
| --------------|--------------|
| A| [{“doc_name”:“doc1a”,“doc_type”:“pdf”},{“doc_name”:“doc1b”,“doc_type”:“}]|
| C| [{“doc_name”:“doc3a”,“doc_type”:[PDF]|

myzjeezk

myzjeezk1#

使用jsonb“contains”运算符**@>**:

SELECT *
FROM   uploads_table
WHERE  value @> jsonb '[{"doc_type":"pdf"}]';

当然,这是假设value的类型是jsonb,这是应该的。
(value)上的GIN索引将使其快速
使用更专业的jsonb_path_ops索引,速度更快:

CREATE INDEX uploads_table_values_gin_idx ON uploads_table USING gin (value jsonb_path_ops);

参见:

  • 在Postgres jsonb中查询数组结构的正确索引是什么?

相关:

  • 查询JSON数组元素中的键
  • 按json数组值选择
35g0bw71

35g0bw712#

你可以在PostgreSQL中使用内置函数jsonb_array_elements。查询语句如下:

SELECT *
FROM uploads_table
WHERE EXISTS (
    SELECT 1
    FROM jsonb_array_elements(value) AS doc
    WHERE doc->>'doc_type' = 'pdf'
);

结果如下图所示:

相关问题