PostgreSQL的LIKE子句中的正则表达式

31 浏览
0 Comments

PostgreSQL的LIKE子句中的正则表达式

我遇到了一个简单的正则表达式问题。不确定我漏掉了什么。正则表达式技能有点生疏。

我试图匹配的表达式是:

select * from table where value like '00[1-9]%'
--(第三个字符不应该是0)

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

0
0 Comments

在PostgreSQL的LIKE子句中使用正则表达式的原因是,LIKE子句只能使用通配符进行模式匹配,而无法使用更复杂的正则表达式。然而,有时候我们需要使用正则表达式来进行更精确的模式匹配。

解决方法是使用正则表达式操作符"~"来使用方括号表达式。例如,可以使用以下查询语句来实现类似的功能:

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

在这个查询语句中,"^"表示匹配字符串的开头,"[^0]"表示匹配任何不是数字0的字符。通过这种方式,我们可以实现类似的功能。

另一种更好的解决方法是使用LIKE子句来进行模式匹配。虽然LIKE子句比正则表达式功能较弱,但通常比正则表达式更快。我们可以通过以下查询语句来实现类似的功能:

SELECT *
FROM   tbl
WHERE  value LIKE '00%'       -- 以'00'开头
AND    value NOT LIKE '000%'  -- 第三个字符不是'0'

为什么要使用LIKE子句而不是正则表达式呢?这是因为PostgreSQL可以使用简单的btree索引来处理以'00'开头的表达式,而对于更复杂的正则表达式可能无法使用索引。最新版本的PostgreSQL可以对简单的正则表达式使用索引,所以对于这个例子来说,也许可以使用索引。具体细节可以参考上面提供的链接。

我们可以通过使用正则表达式操作符"~"或者使用LIKE子句来实现类似的模式匹配功能。使用LIKE子句可以更快地缩小候选集合,并且可以使用索引来提高查询性能。

0
0 Comments

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

在这里检查一个跨数据库的全面列表。

这不仅适用于Postgres。SQL标准没有为LIKE操作符定义任何正则表达式。

永远不要使用SIMILAR TO。

为什么会这样呢?

:我在链接中解释了我的理由。

0