postgresql 中的通配符搜索
Posted
技术标签:
【中文标题】postgresql 中的通配符搜索【英文标题】:Wildcard search in postgresql 【发布时间】:2013-06-18 04:36:06 【问题描述】:在 postgresql 中,我设法使用 SIMILAR TO 选项将通配符 pattern (*) 添加到查询中。所以我的查询是,
SELECT * FROM table WHERE columnName SIMILAR TO 'R*'
此查询将返回从“R”而不是“r”开始的所有实体。我想让它不区分大小写。
【问题讨论】:
我会考虑用正则表达式匹配 (~
) 或其他可用运算符之一替换 any 出现的 SIMILAR TO
。我写了一个comprehensive answer with details on dba.SE。
【参考方案1】:
使用ILIKE
:
SELECT * FROM table WHERE columnName ILIKE 'R%';
或不区分大小写的正则表达式:
SELECT * FROM table WHERE columnName ~* '^R.*';
两者都是 PostgreSQL 扩展。 Sanjaya 已经概述了符合标准的方法 - 使用 lower(...)
过滤两边或使用双分支 SIMILAR TO
表达式。
SIMILAR TO
不够可爱,最好避免。见this earlier answer。
你可以写:
SELECT * FROM table WHERE columnName SIMILAR TO '(R|r)%'
但我不特别推荐使用SIMILAR TO
。
【讨论】:
谢谢。我也尝试过使用 ilike。问题是,我有一个场景,用户可以输入确切的实体名称或使用通配符模式。因此,当用户输入确切的实体名称时,它还会显示与确切实体名称相关的所有内容。我不希望这种情况发生。 刚刚修复了正则表达式,我忘了添加左锚(^
)以确保R
是第一个字符。
@Rinny 您必须将通配符语法转换为 LIKE
模式。无论如何,无论您使用什么,您都应该这样做,以避免在用户输入文本时混淆用户,如果他们的模式匹配语法无效,则会出现奇怪的数据库错误。除非您要强制用户直接输入有效的 POSIX 正则表达式、扩展正则表达式、LIKE 模式或其他内容……否则对用户不友好。所以我会解析他们的输入并从中生成一个新的表达式以插入到 SQL 中。
谢谢克雷格。我会这样做的。【参考方案2】:
试试
SELECT * FROM table WHERE columnName SIMILAR TO 'R%|r%'
【讨论】:
好主意,这也是标准的......显然没有多少数据库实现SIMILAR TO
。
@Sanjaya。谢谢。但它不起作用。在我的查询中,搜索文本将来自用户。所以用户也可以给出 r* 或整个实体名称。
@Sanjaya。谢谢。这行得通。但是,现在如果我给出与实体名称完全匹配的查询,如“R1”,它会显示“R11”、“R12”、“TR1”、“TR123”等。我该怎么办?
@Rinny 最后测试这个答案。如果不是我退出:(
@SanjayaLiyanage sqlfiddle.com 对此非常有用。但是,当答案未经测试时,请这样说,这有助于避免混淆。顺便说一句,您最近的编辑无效; LIKE
不使用与 SIMILAR TO
相同的表达式语法。实际上,原版在测试中也不起作用,尽管我认为我应该记错了很少使用的 SIMILAR TO
语法。文档说:与 LIKE 一样,SIMILAR TO 使用 _ 和 % 作为通配符,分别表示任何单个字符和任何字符串,因此您必须编写 'R%|r%'
以上是关于postgresql 中的通配符搜索的主要内容,如果未能解决你的问题,请参考以下文章
跨多个列 PostgreSQL/Rails 的慢速通配符搜索 LIKE
postgres 错误:Postgresql 11.6 中的列不存在错误