Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类PostgreSQL子句中的正则表达式_Sql_Regex_Postgresql_Pattern Matching - Fatal编程技术网

类PostgreSQL子句中的正则表达式

类PostgreSQL子句中的正则表达式,sql,regex,postgresql,pattern-matching,Sql,Regex,Postgresql,Pattern Matching,我只能用一个简单的正则表达式。不知道我错过了什么。对正则表达式技巧有点生疏 我试图匹配的表达式是: select * from table where value like '00[1-9]%' -- (third character should not be 0) 所以这应该与'0090D0DF143A'(格式:text)匹配,但不是 PostgreSQL的LIKE运算符不支持[charlist],但是类似的运算符支持[charlist] 检查DBs中的综合列表如需使用,您必须使用。 但还

我只能用一个简单的正则表达式。不知道我错过了什么。对正则表达式技巧有点生疏

我试图匹配的表达式是:

select * from table where value like '00[1-9]%'
-- (third character should not be 0)

所以这应该与
'0090D0DF143A'
(格式:text)匹配,但不是

PostgreSQL的
LIKE
运算符不支持[charlist],但是
类似的
运算符支持[charlist]

检查DBs中的综合列表

如需使用,您必须使用。
但还有更多。我建议:

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
表达式缩小候选集的速度可能要快得多

通常,您会使用
而不是像“\uu 0”
,但由于我们已经在另一个谓词中建立了
而不是像“00%”
,因此我们可以使用更窄(更便宜)的模式
而不是像“000”

Postgres可以对左锚定表达式
值(如'00%'
)使用简单的btree索引,而这对于更复杂的正则表达式可能不起作用。最新版本的Postgres可以将索引用于简单的正则表达式,因此它可能适用于本例。详情:


SQL
LIKE
运算符不支持正则表达式。您需要使用类似于
~
运算符:可能是
'^00[^0]'
'^00[^0]..'
而不是第一次查询中的
'^00[^0]'
?否则它与示例
0090D0DF143A
不匹配,它确实为此正则表达式使用索引,请参见:@NickBarnes:在这种情况下,第一个查询的速度与第二个查询的速度差不多。如果没有匹配索引,第二个将大大加快。我在你的小提琴上进行了测试:sqlfiddle上的性能测试并不总是可靠的。我在本地的9.3设置中运行了这些测试。@Erwin-Wow,非常不同!我必须记住那个;)这不是专为博士后准备的。SQL标准没有为
LIKE
操作符定义任何正则表达式。为什么@ErwinBrandstetter会这样?@borarak:我链接到了我的基本原理。