Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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
Mysql 字符串中相邻字符的SQL正则表达式_Mysql_Sql_Regex - Fatal编程技术网

Mysql 字符串中相邻字符的SQL正则表达式

Mysql 字符串中相邻字符的SQL正则表达式,mysql,sql,regex,Mysql,Sql,Regex,我正在寻找一种使用正则表达式在字符串中运行特定模式的SQL查询的方法。字符串由开头的字母A组成,然后是3个随机字符,后面是字符对“AB”、“CD”或“EF”。(不能是“BA”、“DC”…) 成功查询的示例: AfGhAB AtttCD 不成功的查询: AtreBA AdrtFC 谢谢, Orna.获取所需内容的简单方法,但不使用正则表达式: select columns from tablename where columnname like 'A%' and substring(colum

我正在寻找一种使用正则表达式在字符串中运行特定模式的SQL查询的方法。字符串由开头的字母A组成,然后是3个随机字符,后面是字符对“AB”、“CD”或“EF”。(不能是“BA”、“DC”…)

成功查询的示例:

AfGhAB

AtttCD

不成功的查询:

AtreBA

AdrtFC

谢谢,
Orna.

获取所需内容的简单方法,但不使用正则表达式:

select columns
from tablename
where columnname like 'A%'
  and substring(columnname from 5 for 2) in ('AB','CD','EF')
SUBSTRING
(ANSI SQL)有时被称为
SUBSTR


可能会执行得更快。

哪个数据库管理系统?(不幸的是,regexp是以许多特定于产品的方式实现的。)声明希望模式匹配
AB
,然后
CD
等的部分不是正则表达式任务。这是一个常见的错误,人们想修复太多的正则表达式。我会让结尾部分自由匹配,然后用代码切掉其余部分<代码>^A\w{3}[A-Z]{2}。你可以在最后一部分用正则表达式添加一行疯狂的
规则,但这似乎毫无用处,而且很可能会使你的查询速度慢得离谱,因为正则表达式搜索几乎每个表条目都必须被检查。你可以这样做:
^A.{3}(?:AB | CD | EF | GH | IJ | KL MN OP | QR | ST | UV WX | YZ)$
祝你好运:PJarlh,我正在使用嵌入xampp中的MySql 5.0.50a。Allendar,谢谢,我会尝试一下。这可能比正则表达式稍微“快”,但它仍然会导致命中每个表项。如果您检查这类查询,即使使用BTREE,MySQL引擎也无法理解,只能遍历
A
-节点并跳过其余部分。遗憾的是,大多数SQL引擎在这些方面都不是很聪明。我更喜欢这个答案,而不是正则表达式解决方案tho:)当我写这篇文章时,没有指定MySQL。至少对于MySQL和Postgres,我知道您添加的另一个
语句将忽略
索引
BTREE
。发生这种情况的原因真的很奇怪,但这似乎是一个缺陷,他们只是做出了妥协,1 LIKE语句将触发索引,但当增加更多的复杂性时,它只会放弃对它的内部优化。在MySQL的情况下,将LIKE移到派生表会有什么不同吗?或者进行自连接?我不是很确定,需要进行测试。我在想;您可以在子查询上执行
WHERE IN
,在子查询中只执行
WHERE LIKE'a%
,并使用父查询中
IN
中匹配的ID仅在其中搜索模式。