如何使用RLIKE在需要的地方有效地组合LIKE和IN、*和*转义regex字符


How can I use RLIKE to effectively combine LIKE and IN, *and* escape regex characters where needed?

我需要弄清楚如何在数据库中查询串行A序列B,或串行C

以前的解决方案使用LIKE(例如SELECT * FROM Table WHERE Serial LIKE)-这对于搜索所有序列(%)或特定序列(Serial A)非常有效。然而,我很快发现INLIKE不能在MySql中组合,并且LIKE使用的通配符不够灵活,无法找到串行A序列B,或串行C

(注意:实际的序列有很多变化,没有一致的约定-我知道像这些基本示例这样简单的序列可以使用%通配符找到)

我当时的想法是改用RLIKE——然而,有些序列的名称是B + 3,如果不转义就无法找到。在这里,我想用一种方法来转义字符,比如preg_quote(),但其中存在更多的系统结构问题。。。


选择约束模块

通过查询数据库(例如SELECT DISTINCT Serial FROM Table)来填充组合框,用户可以从中选择序列号,然后提交表单。所选序列号作为GET值传递到下一页。

查看结果模块

$serial变量的内容作为参数传递给SQL查询,以在页面上生成结果。$serial由查看结果模块所属的页面填充,或由传递给页面的GET值填充(如果在模块为include d之前页面尚未填充该值,并且没有GET值,则会引发错误)。


这个结构让我有点困惑。如果用户传递了RLIKEpreg_quote()来搜索序列号,那么这似乎非常简单。preg_quote()在作为参数传递之前可以在$serial上使用,并且更新的(WHERE Serial RLIKE)查询应该按预期工作。然而,我仍然不知道如何搜索多个序列。

如果我将$serial指定为(Serial A | Serial B | Serial C),那么preg_quote()将转义正则表达式字符而找不到它们。但是,如果我不使用preg_quote(),那么将找不到像B + 3这样的序列,因为regex字符将不显示。


我非常感谢任何关于改进这个问题的反馈——我试图尽可能清楚地解释它,但背景和限制的复杂性使它变得困难。非常感谢。

转义子字符串,而不是最终的regexp。

"(" . preg_quote(serialA) . "|" . preg_quote(serialB) . "|" . preg_quote(serialC) . ")"