回答

收藏

PostgreSQL文本数组子字符串搜索[重复]

技术问答 技术问答 228 人阅读 | 0 人回复 | 2023-09-12

在我的查询中,我想找到很多LIKE匹配运算符之一。我知道这样做的三种方法,但只有一种可以使用索引。6 F( @1 ]& F/ p% z6 w
让我们从表格开始:
: Z6 m' g7 J9 `! l5 b: V- dCREATE TABLE dir  id BIGSERIAL PRIMARY KEY,   path TEXT NOT NULL);CREATE INDEX path_idx ON dir(path TEXT_pattern_ops);插入样本数据后,我可以执行以下操作:
( i0 ^6 \& N- `0 Y7 Q$ h( h3 d* cEXPLAIN ANALYZE SELECT id,path FROM dir   WHERE path LIKE 'A        OR path LIKE 'B        OR path LIKE 'C%';正确使用索引进行上述查询。  A/ q) g" F: @
第二种方法:% ^  B+ x! ~* `$ E3 T2 O
EXPLAIN ANALYZE SELECT id,path FROM dir  WHERE path LIKE ANY(ARRAY['A%','B%','C%']::TEXT[]);该查询将不使用索引。我知道的最后一种方法:. [3 ?5 I+ h5 Y. n) L
CREATE TABLE patterns (pattern) AS VALUES('A(%),B(%),C%');EXPLAIN ANALYZE SELECT id,path FROM dir  JOIN patterns ON (dir.path LIKE patterns.pattern);类似于上一个查询,该查询将不使用索引。; z$ P: H6 }+ Q1 N' O. R6 H
这是SQL Fiddle,适用于那些想如何使用这些查询的人:http :0 a* C2 a3 H/ v  n
//sqlfiddle.com/#!17/24031/2
5 C) y, n% ?' q* {+ I% z* E' l4 p问题:path LIKE X OR path LIKEY对于许多模式,使用的查询是完全不可读的(模式的数量可能从几百到几千不等),恐怕大型查询的分析速度可能很慢,甚至不能达到1GB查询长度限制(有些模式可能有很长的前缀)。
% K: ~7 I$ @. Y% F7 [" u问题:    是否有oder方法返回相同的结果,而不需要直接将所有模式放入查询中(例如在带有join)?( V& e  o" ]: I. O% v' O$ }
                                                                4 C6 f8 I" Y' Q) b
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则