我被一个简单的正则表达式困住了。不知道我错过了什么。对正则表达式技能有点生疏。
我试图匹配的表达式是:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
所以这应该匹配'0090D0DF143A'
(格式:文本)但事实并非如此!
Like @a_horse 评论了 https://stackoverflow.com/questions/24368404/regular-expression-in-postgresql-like-clause#comment37682867_24368404,你必须使用正则表达式运算符~ https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP to use 括号表达式 https://www.postgresql.org/docs/current/functions-matching.html#POSIX-ATOMS-TABLE.
但还有更多。我建议:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
...匹配字符串的开头(您的原始表达式可以匹配any位置)。
[^0]
...匹配的括号表达式(字符类)any不是的字符0
.
Or better, yet:
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
Why? LIKE
不如正则表达式强大,但通常比正则表达式更快。用便宜的价格缩小候选人范围可能要快得多LIKE
表达。
一般来说,你会使用NOT LIKE '__0'
,但是既然我们已经建立了LIKE '00%'
在另一个谓词中,我们可以使用更窄(更便宜)的模式NOT LIKE '000'
.
Postgres 可以使用简单的 btreeindex对于左锚定表达式value LIKE '00%'
(对于大表很重要),尽管这可能不适用于更复杂的正则表达式。最新版本的Postgres可以对简单的正则表达式使用索引,所以它might为这个例子工作。细节:
- Postgres 中 LIKE 和 ~ 的区别 https://stackoverflow.com/questions/12452395/difference-between-like-and-in-postgres/12459689#12459689
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)