简短答案
您可以
jsonb_array_elements()在横向联接中使用该函数,并
value在
WHERe子句中的复杂表达式中使用其结果:
SELECt t.* FROM test tCROSS JOIN jsonb_array_elements(test_content)WHERe value->>'label' IN ('b', 'd')AND value->>'label1' IN ('2', '3')不同
当在单个行中的多个数组元素中满足过滤条件时,查询可能返回重复的行,例如
SELECt t.* FROM test tCROSS JOIN jsonb_array_elements(test_content)WHERe value->>'label' IN ('a', 'b') id | test_content --------------------------------------+---------------------------------------------------------------- aa82a8b8-33ef-4937-bd8c-8a4b40960f18 | [{"label": "a", "label1": "1"}, {"label": "b", "label1": "2"}] aa82a8b8-33ef-4937-bd8c-8a4b40960f18 | [{"label": "a", "label1": "1"}, {"label": "b", "label1": "2"}](2 rows)因此
DISTINCT,在
SELECt列表中使用可能是合理的:
SELECT DISTINCT t.* FROM test tCROSS JOIN jsonb_array_elements(test_content)WHERe value->>'label' IN ('a', 'b')或
EXISTS在
WHERe子句中,可能会更快一些:
SELECt t.*FROM test tWHERe EXISTS ( SELECt FROM jsonb_array_elements(test_content) WHERe value->>'label' IN ('a', 'b') )在需要此信息的情况下,您也可以选择匹配的数组元素:
SELECt id, valueFROM test tCROSS JOIN jsonb_array_elements(test_content)WHERe value->>'label' IN ('a', 'b') id | value --------------------------------------+------------------------------- aa82a8b8-33ef-4937-bd8c-8a4b40960f18 | {"label": "a", "label1": "1"} aa82a8b8-33ef-4937-bd8c-8a4b40960f18 | {"label": "b", "label1": "2"}(2 rows)表现
该
jsonb_array_elements()功能很昂贵。对于较大的表,由于服务器负载沉重且查询执行时间长,该功能的使用可能会令人怀疑。
虽然GIN索引可用于与
@>运算符的查询:
CREATE INDEX ON test USING GIN (test_content)
对于该功能,这是不可能的。索引支持的查询可能比使用该函数的查询快几十倍。



