相关疑难解决方法(0)

针对多个值的 PostgreSql JSONB SELECT

我有一个非常简单的 JSON 表,其中填充了一些示例数据:

CREATE TABLE jsonthings(d JSONB NOT NULL);

INSERT INTO jsonthings VALUES ('{"name":"First","tags":["foo"]}');
INSERT INTO jsonthings VALUES ('{"name":"Second","tags":["foo","bar"]}');
INSERT INTO jsonthings VALUES ('{"name":"Third","tags":["bar","baz"]}');
INSERT INTO jsonthings VALUES ('{"name":"Fourth","tags":["baz"]}');

CREATE INDEX ON jsonthings USING GIN(d);
Run Code Online (Sandbox Code Playgroud)

并且在运行SELECT. SELECT获取值为单个项目的行的简单方法工作正常:

SELECT d FROM jsonthings WHERE d @> '{"name":"First"}';
Run Code Online (Sandbox Code Playgroud)

但是当尝试运行匹配多个值的查询时,name我无法找到如何使用索引。我试过了:

SELECT d FROM jsonthings WHERE d->>'name' = ANY(ARRAY['First', 'Second']);
SELECT d FROM jsonthings WHERE d->'name' ?| ARRAY['First', 'Second'];
SELECT d FROM jsonthings WHERE d#>'{name}' ?| ARRAY['First','Second'];
Run Code Online (Sandbox Code Playgroud)

并且所有这些都显示了对表的顺序扫描(enable_seqscan=false如果可能,我正在使用强制使用索引)。有什么方法可以重写查询以便它使用索引?我知道我可以这样做: …

postgresql json postgresql-9.4

7
推荐指数
2
解决办法
9414
查看次数

在 JSONB 记录数组中查找包含键的行

我正在尝试查询对象数组中存在的键。这种结构:

column jdata
{"name": "Somedata",
 "array": [ {"name":"bla1", "attr": "somevalue"}, 
            {"name":"bla2", "otherdata": "somevalue2"},
            {"name":"bla3", "otherdata": "somevalue"}
           ],
"otherstuff": "stuff"
}
Run Code Online (Sandbox Code Playgroud)

现在我在jdata->'name'or上做 btree (jdata->'datetime')::cast,效果很好。

我也做 json_path_opsjdata->'array' @> '[{"name":"bla3"}]'真正的魅力所在。

我的问题是attr键可以在数组中的任何对象中,如果键存在,我关心记录,但是值几乎可以是任何东西。有没有办法查询这个?有没有办法索引它?我想做jdata->'array' @> '[{"attr": ?}]'或者也许? 'attr'可以在数组中以某种方式使用?

目前我正在考虑一个扫描键的触发器,然后将它移动到一个带有 true 或 false 或其他什么的标题,然后一个普通的 btree 将工作。有没有更好的办法?我需要在平均站点上编辑大约 50 万条记录才能添加这些值。

请给我指明一个方向。

postgresql index array json json-path

5
推荐指数
1
解决办法
2万
查看次数

有效地搜索整个 1 级嵌套 JSONB

假设我们需要检查 jsonb 列是否包含与任何值(非嵌套,仅第一级)中的子字符串匹配的特定值。

如何有效地优化查询以搜索JSONB每个值的整个列?

是否有一些好的替代方法可以替代转换ILIKE %val%为文本的 jsonb 数据类型?

jsonb_each_text(jsonb_column) ILIKE '%val%'
Run Code Online (Sandbox Code Playgroud)

例如,考虑以下数据:

SELECT '{"col1": "somevalue", "col2": 5.5, "col3": 2016-01-01, "col4": "othervalue", "col5": "yet_another_value"}'::JSONB
Run Code Online (Sandbox Code Playgroud)

当需要%val%在列中包含不同键配置的记录中搜索模式时,您将如何优化这样的查询?是否有更好的替代方法来将每个键值对提取为文本并执行 ILIKE/POSIX 搜索?

主要是,我正在寻找一种不同的替代方法来将整个 jsonb 字段解压缩到单独的键行中,它们的值为 text

postgresql json postgresql-9.5

3
推荐指数
1
解决办法
2465
查看次数