0

这是我的query,它有效。我将字典列表存储在我的jsonb专栏中。

SELECT
    items.title
FROM
    items
WHERE
    jsonb_path_exists(items.types::jsonb, '$[*] ? (@.target == "discount")')

有没有办法在没有jsonb_path_exists()功能的情况下写这个?

此外,JSON 处理函数是否使用索引?

我想简化查询的可读性/外观,因为它太长了。并且好奇我是否可以通过不使用 JSON 处理函数来获得任何性能改进。

我试图用它替换它@?但失败了。这就是我使用的(引自 PostgreSQL)

jsonb@? jsonpath → 布尔值

JSON 路径是否返回指定 JSON 值的任何项目?

'{"a":[1,2,3,4,5]}'::jsonb @? '$.a[*] ?(@ > 2)' → t

很感谢任何形式的帮助。

4

1 回答 1

2

jsonb_path_xxx()JSON 路径的评估在函数和等效运算符之间有点不同。最重要的是,您不需要? (...)使用运算符时隐含的条件。

以下应该是等效的:

where items.types::jsonb @? '$[*].target == "discount"'

如果您想简化或缩短查询,请引入别名,items以便您无需在任何地方重复完整的表名。将列转换typesjsonb将进一步简化您的查询,因为您不再需要强制转换。


并且好奇我是否可以通过不使用 JSON 处理函数来获得任何性能改进。

@?操作员可以使用GIN索引——但这仅适用于jsonb数据json类型。

上述 where 条件可以使用以下索引:

create index on items using gin ( (types::jsonb) );

如果列被正确定义为 ,则可以通过删除强制转换来简化索引定义jsonb

于 2021-08-17T05:22:56.567 回答