Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
Sql 测试正常时正则表达式工作不正常_Sql_Regex_Postgresql - Fatal编程技术网

Sql 测试正常时正则表达式工作不正常

Sql 测试正常时正则表达式工作不正常,sql,regex,postgresql,Sql,Regex,Postgresql,对于我的数据库,我有一个公司编号列表,其中一些编号以两个字母开头。我已经创建了一个正则表达式,它应该可以从查询中删除这些内容,根据我的测试,它应该可以。但执行时,结果仍然包含带字母的数字 这是我的正则表达式,我已经测试过了 我已经对它进行了大量的测试,比如SC08093、ZC00191和NI232312,它们不应该匹配,也不在测试中,这很好 我的sql查询看起来像 SELECT companyNumber FROM company_data WHERE companyNumber ~ '([^

对于我的数据库,我有一个公司编号列表,其中一些编号以两个字母开头。我已经创建了一个正则表达式,它应该可以从查询中删除这些内容,根据我的测试,它应该可以。但执行时,结果仍然包含带字母的数字

这是我的正则表达式,我已经测试过了

我已经对它进行了大量的测试,比如SC08093、ZC00191和NI232312,它们不应该匹配,也不在测试中,这很好

我的sql查询看起来像

SELECT companyNumber FROM company_data 
WHERE companyNumber ~ '([^A-Z+|a-z+].*)' order by companyNumber desc
总之,像SC08093这样的字符串不应该匹配,因为它们以字母开头


我已经阅读了postgres的文档,但似乎找不到任何与此相关的内容。我不确定我错过了什么。谢谢。

不要以一封信开头,可以用

WHERE company ~ '^[^A-Za-z].*'
第一个标志着开始。[^A-Za-z]上没有字母,包括小写和大写字母


编辑:将[A-z]更改为更精确的[A-Za-z]

不以字母开头可以用

WHERE company ~ '^[^A-Za-z].*'
第一个标志着开始。[^A-Za-z]上没有字母,包括小写和大写字母

编辑:将[A-z]更改为更精确的[A-Za-z]

“[^A-z+|A-z+].*”不起作用,因为这是一个[^A-z+|A-z+].*正则表达式匹配操作,即使在部分匹配时也返回true正则表达式匹配操作不需要完全字符串匹配,因此模式可以匹配字符串中的任何位置。[^A-Z+| A-Z+].*匹配从A到Z的字母、+、|或从Atoz`的字母,然后匹配字符串中任意数量的零个或多个字符

你可以用

WHERE companyNumber NOT SIMILAR TO '[A-Za-z]{2}%'

此处,NOT Simploy TO返回操作的反向结果。这个类似于TO的操作符接受几乎是regex模式的模式,但也类似于常规通配符模式。与“[A-Za-z]{2}%”不同的是,所有以两个ASCII字母[A-Za-z]{2}开头且在%之后有任何内容的记录都不会返回,其他所有记录都会返回。请注意,类似于需要完全字符串匹配,与类似一样。

由于这是一个[^a-Z+|a-Z+].*正则表达式匹配操作,即使在部分匹配时返回true,正则表达式匹配操作也不需要完全字符串匹配,因此模式可以匹配字符串中的任何位置。[^A-Z+| A-Z+].*匹配从A到Z的字母、+、|或从Atoz`的字母,然后匹配字符串中任意数量的零个或多个字符

你可以用

WHERE companyNumber NOT SIMILAR TO '[A-Za-z]{2}%'

此处,NOT Simploy TO返回操作的反向结果。这个类似于TO的操作符接受几乎是regex模式的模式,但也类似于常规通配符模式。与“[A-Za-z]{2}%”不同的是,所有以两个ASCII字母[A-Za-z]{2}开头且在%之后有任何内容的记录都不会返回,其他所有记录都会返回。请注意,类似于需要完整的字符串匹配,与LIKE相同。

您的模式:[^a-Z+| a-Z+].*表示至少有一些字符不是a-Z的字符串-要将其扩展到整个字符串,您需要使用由S-Man定义的组所示的锚定正则表达式。。顺便说一句,这不是真的必要

我可能会使用一个正则表达式来指定有效模式是什么,然后使用!~相反

^[0-9].*$表示只包含数字和!~手段不匹配

您的模式:[^A-Z+| A-Z+].*表示至少有一些字符不是A-Z的字符串-要将其扩展到整个字符串,您需要使用由S-Man定义的组所示的锚定正则表达式。。顺便说一句,这不是真的必要

我可能会使用一个正则表达式来指定有效模式是什么,然后使用!~相反

^[0-9].*$表示只包含数字和!~手段不匹配


试试companyNumber与“[A-Za-z]{2}%”不相似的地方谢谢,这很有效。如果可以的话,你能解释一下为什么这样做有效,而我的正则表达式可能不起作用吗?你的正则表达式可能没有达到你的目的-[^A-Z+|A-Z+]将匹配一个既不是小写字母也不是大写字母也不是字面+也不是字面“|”的单个字符。请尝试公司编号与“[A-Za-Z]{2}%”不相似的地方,谢谢,这是有效的。如果可以的话,你能解释一下为什么我的正则表达式不起作用而我的正则表达式可能不起作用吗?你的正则表达式可能没有达到你的目的-[^A-Z+| A-Z+]将匹配一个既不是小写字母也不是大写字母,也不是literal+也不是literal'|的字符。谢谢你,这很有效。如果可以的话,你能解释一下为什么我的正则表达式不起作用吗?@KieranDee我希望我补充了足够的细节。我认为类似的是最适合你的任务。如果你的条件变得更具体,你可以考虑移动到~运算符。然后,别忘了用“^”来标记字符串的开头,如果你需要,$作为字符串锚的结尾。谢谢你的解释。所以即使字符串的任何部分匹配
regex、postgres基本上会返回它。这意味着我必须将整个字符串与正则表达式匹配,而不是其中的一部分,至少对于我的正则表达式是这样。谢谢,这很有效。如果可以的话,你能解释一下为什么我的正则表达式不起作用吗?@KieranDee我希望我补充了足够的细节。我认为类似的是最适合你的任务。如果你的条件变得更具体,你可以考虑移动到~运算符。然后,别忘了用“^”来标记字符串的开头,如果你需要,$作为字符串锚的结尾。谢谢你的解释。因此,即使字符串的任何部分与正则表达式匹配,postgres基本上也会返回它。这意味着我必须将整个字符串与正则表达式匹配,而不是其中的一部分,至少对我的正则表达式而言。[^A-z]实际上并不意味着没有字母。它的意思是没有字母、[、\、]、^、u和`字符。看。@WiktorStribiżew是的,你当然是对的。在这种情况下,另一种解决方案也是错误的,因为它总是以数字开头。这时TO-no确切地定义了它的用例。[^A-z]实际上并不意味着没有字母。它的意思是没有字母、[、\、]、^、u和`字符。看。@WiktorStribiżew是的,你当然是对的。在这种情况下,另一种解决方案也是错误的,因为它总是以数字开头。这就是TO no准确定义其用例的时候。
where not (company ~ '^[0-9].*$')