如何在没有 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
。
,则可以通过删除转换来简化索引定义
这是我的 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
。