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

:: 在 PostgreSQL 中做啥? [复制]

postgres 错误:Postgresql 11.6 中的列不存在错误

PostgreSQL在没有时区的时间戳类型的表中搜索

Postgresql:如何为postgres中的相同时间戳选择“媒体”列中的最大值?

如何使 postgres 快速搜索