我是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