bor*_*rak 15 regex sql postgresql pattern-matching
我坚持使用一个简单的正则表达式.不知道我错过了什么.在正则表达式技能上有点生疏.
我想要匹配的表达是:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
Run Code Online (Sandbox Code Playgroud)
所以这应该匹配'0090D0DF143A'(格式:文本),但它不是!
Erw*_*ter 26
与@a_horse评论一样,您必须使用正则表达式运算符~来使用括号表达式.
但还有更多.我建议:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
Run Code Online (Sandbox Code Playgroud)
^...在字符串开头匹配(您的原始表达式可以在任何位置匹配).
[^0]...一个括号表达式(字符类)匹配任何不是的字符0.
或者更好,但是:
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
Run Code Online (Sandbox Code Playgroud)
为什么?LIKE没有那么强大,但通常比正则表达式更快.用廉价的LIKE表达来缩小候选人的范围可能要快得多.
通常,您会使用NOT LIKE '__0',但由于我们已经LIKE '00%'在其他谓词中建立,我们可以使用更窄(更便宜)的模式NOT LIKE '000'.
Postgres可以对左锚定表达式使用简单的btree 索引value LIKE '00%'(对于大表很重要),而这可能不适用于更复杂的正则表达式.Postgres的最新版本可以使用索引来表示简单的正则表达式,因此它可能适用于此示例.细节:
| 归档时间: |
|
| 查看次数: |
21446 次 |
| 最近记录: |