我被一个简单的正则表达式困住了。不知道我错过了什么。对正则表达式技能有点生疏。
我要匹配的表达式是:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
所以这应该匹配
'0090D0DF143A'
(格式:文本),但事实并非如此!
~
。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 11 添加了“开始于”运算符 ^@
WHERE value ^@ '00' -- starting with '00'
AND value !~~ '000%' -- third character is not '0'
!~~
是 Postgres 运算符,用于实现 SQL 构造
NOT LIKE
。所以这只是可选的弯曲。但
^@
可以带来实际的改变。对于初学者,您可以使用裸字符串而不连接通配符作为模式。参见: