如果您只想要简单的匹配,这很好用。假设在 JSON 数据中tracks同时具有Artist和Title字段。所以我们有类似的东西:
INSERT INTO tracks (id, data)
VALUES (1, '[{"artist": "Simple Plan", "title": "Welcome to My Life"}]');
Run Code Online (Sandbox Code Playgroud)
我们像在原始问题中一样创建索引:
CREATE INDEX tracks_artists_gin_idx ON tracks
USING GIN (json2arr(data, 'artist'));
CREATE INDEX tracks_title_gin_idx ON tracks
USING GIN (json2arr(data, 'title'));
Run Code Online (Sandbox Code Playgroud)
所以现在我们有两个字段要匹配。如您所见,如果我们执行以下原始查询(经过非常简单的修改):
SELECT *
FROM tracks
WHERE '{"ARTIST NAME"}'::text[] <@ (json2arr(data, 'artist'))
AND '{"TITLE"}'::text[] <@ (json2arr(data, 'title'))
Run Code Online (Sandbox Code Playgroud)
这将给出错误的答案,因为 JSON 数组中的艺术家和标题数组的索引不必匹配此查询以匹配 JSON 中的某些内容。执行此查询的正确方法是什么,以便我们可以获得所需的精确匹配?是否json2arr()需要改变?
编辑:为什么这是错误的
假设我们的表有如下记录:
INSERT INTO tracks (id, data) …Run Code Online (Sandbox Code Playgroud)