我是postgreSQL的新手,面临一个奇怪的问题:
查询为同一正则表达式返回不同的结果。这怎么可能?
为什么前3个查询在最后一个返回正确的'true'时返回null。
我读了postgreSQL documentation,但仍然无法弄清楚这些功能之间的区别。
请帮忙。
select '12340599' like '^[0-9]*$'
select '12340599' similar to '^[0-9]*$'
select substring('12340599' from '^[0-9]*$' for '#')
select '12340599' ~ '^[0-9]*$'
答案 0 :(得分:0)
你让运营商感到困惑;深入了解文档: 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
选择'12340599'类似于'^ [0-9] * $':
SIMILAR TO
的行为与LIKE
运算符类似,但也不区分大小写。
选择子字符串('^ [0-9] *''代表'#'的'12340599'):
您正在使用substring(string from pattern for escape)
提取与SQL正则表达式匹配的子字符串。
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
答案 1 :(得分:0)
嗯,文档中写得很好。每个运算符都支持特定的模式系统:
<强> LIKE 强>
如果pattern不包含百分号或下划线,则该模式仅表示字符串本身;在这种情况下,LIKE的行为类似于equals运算符。模式中的下划线(_)代表(匹配)任何单个字符;百分号(%)匹配零个或多个字符的任何序列。
类似于
它类似于LIKE,除了它使用SQL标准的正则表达式定义来解释模式。 SQL正则表达式是LIKE表示法和常用正则表达式表示法之间的奇怪交叉。
在您已经看到的the same docs中可以找到SQL正则表达式的确切内容。这些比POSIX正则表达式小一点。例如,他们不支持^
和$
个特殊字符。
〜操作员
<强>子强>
请参阅此http://www.postgresql.org/docs/current/static/functions-string.html
如果将它与FOR
一起使用,它将对SQL正则表达式起作用。如果没有FOR
,它就会对POSIX正则表达式起作用。