在JSON数组中查找元素的索引

在JSON数组中查找元素的索引

我有张桌子看起来像这样:

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))

然而,这做了一个完整的表格扫描,它不是很快。我尝试使用函数创建GIN索引names_as_array(artists),并使用'ARTIST NAME' = ANY names_as_array(artists)但是,没有使用索引,而且查询实际上要慢得多。


手掌心
浏览 2708回答 3
3回答

catspeake

这不起作用,因为返回SETOF不能在索引中使用。除去这些,我可以创建索引,但是查询计划器没有使用它。另外,json_Array_元素和Array_agg都是IMMUTABLE
打开App,查看更多内容
随时随地看视频慕课网APP