我坚持使用一个简单的正则表达式.不知道我错过了什么.在正则表达式技能上有点生疏.
我想要匹配的表达是:
select * from table where value like '00[1-9]%' -- (third character should not be 0)
所以这应该匹配’0090D0DF143A'(格式:文本),但它不是!
与
@a_horse commented一样,您必须使用
regular expression operator
但还有更多.我建议:
原文链接:https://www.f2er.com/postgresql/192189.html~
才能使用
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索引作为左锚定表达式值LIKE ’00%'(对于大表很重要),而这可能不适用于更复杂的正则表达式. Postgres的最新版本可以使用索引来表示简单的正则表达式,因此它可能适用于此示例.细节: