LIKE查询平面jsonb数组的元素

时间:2018-04-30 13:25:33

标签: arrays postgresql pattern-matching jsonb postgresql-9.6

我有一个Postgres表posts,其中包含jsonb类型的列,它基本上是一个平面的标记数组。

我需要做的是以某种方式对tags列元素运行LIKE查询,这样我就可以找到一个帖子,其中的标签以某个部分字符串开头。

Postgres有可能吗?我一直在寻找超级复杂的例子,没有人会描述这种基本和简单的场景。

我当前的代码可以正常检查是否有帖子有特定标签:

select * from posts where tags @> '"TAG"'

我正在寻找一种在

之间运行的方法
select * from posts where tags @> '"%TAG%"'

1 个答案:

答案 0 :(得分:3)

SELECT *
FROM   posts p
WHERE  EXISTS (
   SELECT FROM jsonb_array_elements_text(p.tags) tag
   WHERE  tag LIKE '%TAG%'
   );

相关,有解释:

这不能使用任何索引。大桌子这么慢。标准化设计like Laurenz already suggested将更优越 - 具有三元组索引:

对于前缀匹配LIKE 'TAG%',没有前导通配符),您可以使用全文索引

CREATE INDEX posts_tags_fts_gin_idx ON posts USING GIN (to_tsvector('simple', tags));

一个匹配的查询:

SELECT *
FROM   posts p
WHERE  to_tsvector('simple', tags)  @@ 'TAG:*'::tsquery

如果您想要自然英语语言,请使用english词典而不是simple(或任何适合您的情况)。

to_tsvector(json(b))需要 Postgres 10 或更高版本。

相关: