如何在没有 JSON 处理函数的情况下在 WHERE 中编写 jsonb

How to write jsonb inside WHERE without JSON Processing Functions

这是我的 query 并且有效。我将词典列表存储在 jsonb 列中。

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

有没有不用jsonb_path_exists()函数的写法?

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

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

我尝试用 @? 替换它,但失败了。 This is what I used (quote from PostgreSQL):

jsonb @? jsonpath → boolean

Does JSON path return any item for the specified JSON value?

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

非常感谢任何帮助。

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

以下应该是等价的:

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

如果您想简化或缩短您的查询,请为 items 引入一个别名,这样您就不需要在所有地方重复完整的 table 名称。将列 types 转换为 jsonb 将进一步简化您的查询,因为您不再需要转换。


And curious if I can get any performance improvements by not using JSON Processing Functions.

@? 运算符可以使用 of a GIN index - 但这仅适用于 jsonb 不适用于 json 数据类型。

以上where条件可以利用如下索引:

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

如果列被正确定义为 jsonb

,则可以通过删除转换来简化索引定义