PostgreSQL LIKE子句中的正则表达式

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的最新版本可以使用索引来表示简单的正则表达式,因此它可能适用于此示例.细节:


小智 5

PostgreSQL 的LIKE运算符不支持 [ charlist ],但是SIMILAR TO支持。

在此处查看跨数据库的完整列表

  • [永远不要使用“SIMILAR TO”。](http://stackoverflow.com/questions/12452395/difference- Between-like-and-in-postgres/12459689#12459689) (6认同)