我被一个简单的正则表达式难住了。不确定自己缺少什么。我的正则表达式技能有些生疏。
我想匹配的表达式是:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
所以这应该匹配'0090D0DF143A'
(格式:文本),但它并没有!
我被一个简单的正则表达式难住了。不确定自己缺少什么。我的正则表达式技能有些生疏。
我想匹配的表达式是:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
所以这应该匹配'0090D0DF143A'
(格式:文本),但它并没有!
像@a_horse评论的那样,您需要使用正则表达式运算符~
来使用方括号表达式。
但是还有更多。我建议:
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 可以为左锚定表达式 value LIKE '00%'
(对于大表格很重要)使用简单的 btree 索引,而对于更复杂的正则表达式可能不起作用。Postgres 的最新版本可以使用简单的正则表达式来建立索引,因此它可能适用于这个例子。详情请参见:
'^00[^0]'
或 '^00[^0].*'
而不是 '^00[^0]%'
?否则它将无法匹配示例 0090D0DF143A
。 - Ihor RomanchenkoPostgreSQL的LIKE
运算符不支持[charlist],但是SIMILAR TO
支持。
查看这里以获取跨数据库的全面列表。
LIKE
运算符定义任何正则表达式。 - user330315SIMILAR TO
。 - Erwin Brandstetter
LIKE
操作符不支持正则表达式,需要使用similar to
或~
操作符:http://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP - user330315