PostgreSQL LIKE子句中的正则表达式

时间:2014-06-23 14:23:21

标签: sql regex postgresql pattern-matching

我坚持使用简单的正则表达式。不知道我错过了什么。在正则表达式技巧上有点生疏。

我试图匹配的表达是:

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

所以这应该匹配'0090D0DF143A'(格式:文字),但它不是!

2 个答案:

答案 0 :(得分:24)

@a_horse commented一样,您必须使用regular expression operator ~来使用bracket expressions
但还有更多。我建议:

SELECT *
FROM   tbl
WHERE  value ~ '^00[^0]'

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

更好,但是:

SELECT *
FROM   tbl
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可以使用简单的btree 索引作为左锚定表达式value LIKE '00%'(对于大表很重要),而这可能不适用于更复杂的正则表达式。最新版本的Postgres可以使用索引来表示简单的正则表达式,因此可能适用于此示例。详细说明:

答案 1 :(得分:0)

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

检查HERE以获取跨DB的综合列表