PostgreSQL LIKE 子句中的正则表达式

问题描述 投票:0回答:2

我被一个简单的正则表达式困住了。不知道我错过了什么。对正则表达式技能有点生疏。

我要匹配的表达式是:

select * from table where value like '00[1-9]%'
-- (third character should not be 0)

所以这应该匹配

'0090D0DF143A'
(格式:文本),但事实并非如此!

sql regex postgresql pattern-matching
2个回答
62
投票

括号表达式仅适用于正则表达式运算符

~

“第三个字符不应该是 0” 翻译为:

WHERE  value ~ '^00[^0]'

^
...在字符串开头匹配(您的原始表达式可以在任何位置匹配)。
[^0]
... 匹配非 0 的任何
字符的括号表达式(字符类)。

或者更好:

WHERE value LIKE '00%' -- starting with '00' AND value NOT LIKE '000%' -- third character is not '0'

LIKE

 没有那么强大,但通常比正则表达式更快。使用廉价的 
LIKE
 表达式来缩小候选范围可能会更快。

通常,您会使用

NOT LIKE '__0'

,但由于我们已经在其他谓词中建立了 
LIKE '00%'
,因此我们可以使用更窄(更便宜)的模式 
NOT LIKE '000'

Postgres 可以使用普通 B 树

index 来表示左锚定表达式(例如 `value LIKE '00%')。在现代 Postgres 中也适用于简单的正则表达式。参见:

  • Postgres 中 LIKE 和 ~ 的区别
Postgres 11 添加了

“开始于”运算符 ^@

。这就是现在的微优化之王:

WHERE value ^@ '00' -- starting with '00' AND value !~~ '000%' -- third character is not '0'

!~~

 是 Postgres 运算符,用于实现 SQL 构造 
NOT LIKE
。所以这只是可选的弯曲。

^@
 可以带来实际的改变。对于初学者,您可以使用裸字符串而不连接通配符作为模式。参见:

  • PostgreSQL LIKE 查询性能变化

6
投票
PostgreSQL 的

LIKE

 运算符不支持 [
charlist],但 SIMILAR TO
 支持。

检查

此处以获取跨数据库的完整列表

© www.soinside.com 2019 - 2024. All rights reserved.