为什么PostgreSQL为模拟正则表达式返回不同的结果



我是postgreSQL的新手,面临着一个奇怪的问题:

查询为同一正则表达式返回不同的结果。这怎么可能?

以及为什么前 3 个查询返回 null 而最后一个查询返回正确的"true"。

我阅读了postgreSQL文档,但仍然无法弄清楚这些功能之间的区别在哪里。

请帮忙。

select '12340599' like '^[0-9]*$'
select '12340599' similar to '^[0-9]*$'
select substring('12340599' from '^[0-9]*$' for '#')
select '12340599' ~ '^[0-9]*$'

嗯,它在文档中写得很好。这些运算符中的每一个都支持特定的模式系统:

喜欢

如果模式不包含百分号或下划线,则模式仅表示字符串本身;在这种情况下,LIKE 的行为类似于等于运算符。模式中的下划线 (_) 代表(匹配)任何单个字符;百分号 (%) 匹配任何零个或多个字符的序列。

它与 LIKE 类似,只是它使用 SQL 标准对正则表达式的定义来解释模式。SQL 正则表达式是 LIKE 表示法和通用正则表达式表示法之间的奇怪交叉。

SQL正则表达式到底是什么可以在你已经看到的相同文档中找到。这些比 POSIX 正则表达式小一点。例如,它们不支持^$特殊字符。

~算子

这些是 POSIX 正则表达式。

请参阅此 http://www.postgresql.org/docs/current/static/functions-string.html

如果将其与 FOR 一起使用,它将作用于 SQL 正则表达式。如果没有FOR它作用于 POSIX 正则表达式。

您混淆了运算符;请更深入地查看文档:http://www.postgresql.org/docs/current/static/functions-matching.html


选择"12340599",如"^[0-9]*$":

LIKE不是正则表达式运算符,它使用 % 来匹配任何零个或多个字符的字符串,并使用_单个字符匹配:

'abc' LIKE 'abc'    true
'abc' LIKE 'a%'     true
'abc' LIKE '_b_'    true
'abc' LIKE 'c'      false

选择类似于"^[0-9]*$"的"12340599":

SIMILAR TO的行为类似于LIKE运算符,但也不区分大小写。


从"^[0-9]*$"中选择子字符串("12340599"作为"#"):

您正在使用提取与SQL正则表达式匹配的子字符串的substring(string from pattern for escape)

substring('Thomas' from '%#"o_a#"_' for '#') -> oma

正则表达式运算符是:

~   Matches regular expression, case sensitive
~*  Matches regular expression, case insensitive
!~  Does not match regular expression, case sensitive
!~* Does not match regular expression, case insensitive

最新更新