最佳答案
我有一张桌子是这样的:
CREATE TABLE tracks (id SERIAL, artists JSON);
INSERT INTO tracks (id, artists)
VALUES (1, '[{"name": "blink-182"}]');
INSERT INTO tracks (id, artists)
VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
还有其他几个列与这个问题无关。有理由将它们存储为 JSON。
我试图做的是查找一个轨道,有一个特定的 艺术家的名字(完全匹配)。
我用这个问题:
SELECT * FROM tracks
WHERE 'ARTIST NAME' IN
(SELECT value->>'name' FROM json_array_elements(artists))
比如说
SELECT * FROM tracks
WHERE 'The Dirty Heads' IN
(SELECT value->>'name' FROM json_array_elements(artists))
但是,这会进行全表扫描,而且速度不是很快。我尝试使用函数 names_as_array(artists)
创建 GIN 索引,并使用了 'ARTIST NAME' = ANY names_as_array(artists)
,但是没有使用索引,而且查询实际上要慢得多。