Là một chỉ mục GIN bạn muốn gì?
Có vẻ như trước tiên bạn cần tổ chức các ID thành một dạng dễ hiểu hơn. Tôi quen thuộc với Python hơn là hiểu các cách PostgreSQL để thao tác JSON, vì vậy tôi đã sử dụng PL / Python cho mục đích này.
DROP TABLE IF EXISTS ids;
CREATE TABLE ids (user_id integer, a jsonb);
INSERT INTO ids VALUES
(1, '{"b": [{"ids": [1, 2, 3, 4]}, {"ids": [2, 3, 4]}, {"ids": [1, 2, 4]}]}'),
(2, '{"b": [{"ids": [2, 3, 4]}]}'),
(3, '{"b": [{"ids": [4, 5, 6]}, {"ids": [6, 7, 8]}]}');
CREATE OR REPLACE FUNCTION extract_ids(a_json jsonb)
RETURNS int[] AS
$BODY$
import json
s = set()
a = json.loads(a_json)
for key in a.keys():
for id_set in a[key]:
s.update(id_set['ids'])
return(list(s))
$BODY$ LANGUAGE plpythonu IMMUTABLE;
SELECT user_id, extract_ids(a)
FROM ids;
CREATE INDEX ON ids USING gin (extract_ids(a));
SELECT user_id
FROM ids
WHERE ARRAY[3] <@ extract_ids(a);