表flights
:
| 路径| Path |
| --| ------------ |
| 新西兰:欧盟| NZ:EU |
| JP:CA| JP:CA |
SELECT
path
FROM
flights
WHERE
path ILIKE '%' || 'jpca' || '%'
字符串
上面的查询不起作用,它需要返回第二行。但它的工作,如果我提供例如:
- JP
- CA
- p
- jp:ca
- 计算机辅助设计
它还应有助于:
- 日本和平协会
- PJ
- CP
- a:p
正则表达式的答案也被接受。
2条答案
按热度按时间nc1teljy1#
如果在匹配之前处理列
path
,则会容易得多匹配单个字符
(更新问题)
假设条件:
path
中找到,则模式匹配。将两个操作数都小写,并将它们视为数组。
如果可能有重复的字母,为了提高效率,请删除它们。
字符串
或者:
型
返回path包含搜索模式中每个字符的所有行。
**
@>
**是数组的“contains”运算符。如果表很大,在表达式上使用GIN索引来支持它,以使其更快(这是此路由的点):
型
相关,链接到更多:
enable_seqscan
设置为off,也未使用数组列上的GIN索引?如果不需要索引支持,简单检查即可:
型
**
~*
**是不区分大小写的正则表达式匹配运算符。相关内容:
子串匹配
(原问题。)
假设条件:
型
这将删除除A-Z和a-z以外的所有字符,并在尝试正则表达式匹配之前将结果转换为小写。相关内容:
如果你的表很大,你需要它更快,创建一个三元组expression index:
型
需要安装附加模块
pg_trgm
。请参阅:或者在你的表中添加一个“生成列”和一个普通的B树索引:
型
然后:
型
请参阅:
xmjla07d2#
如果你不希望词条中的字符按这个顺序出现,而只想指定一个搜索来匹配这些字符中的每一个,你可以使用
ALL
关键字来同时匹配多个ILIKE
模式:字符串
现在,要从单个字符串生成该数组,可以使用
型
(online demo)