【问题标题】:Convert standard simplified pattern ( * ? ) to the LIKE pattern ( % _ )将标准简化模式 ( * ? ) 转换为 LIKE 模式 ( % _ )
【发布时间】:2012-10-20 18:55:19
【问题描述】:

我想知道是否有更好的方法:

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('p%a_t*er?', '\\', '\\\\'), '%', '\%'), '_', '\_'), '*', '%'), '?', '_')

在 MySQL 中将标准搜索模式 *? 转换为 LIKE 等效项 %_

【问题讨论】:

    标签: mysql sql-like


    【解决方案1】:

    您可以像这样使用 Mysql 的 regexp 而不是 like

    select * from my_table where col_name regexp 'p%a_t*er?';
    

    使用正则表达式时,无需进行所有这些替换以使您的字符串 like 友好。

    【讨论】:

    • 但在我的简化模式中可能是特殊的正则表达式字符($^[]() 等),我仍然需要来抑制它们。而且我不能要求我的客户学习正则表达式:-)
    • 如果您使用的是 PHP,那么您可以使用以下代码引用文本:stackoverflow.com/questions/4024188/…
    • 但这也会引用我的 * 和 ?,所以我需要取消引用这些字符。 .* 不是处理 * 简化的正确正则表达式模式吗?
    【解决方案2】:

    没有更短的方法可以直接在 MySQL 中执行多字符替换。有诸如用户定义函数 (UDF) 之类的替代方法,但我怀疑任何方法都对您的确切目的有益。

    如果可以接受,我的建议是在查询数据库之前执行文本替换。

    在 PHP 中,可以这样做:

    $searchQuery = $_GET['q'];
    $searchQuery = str_replace(array('*', '?'), array('%', '_'), $searchQuery);
    // perform your query as normal
    

    在 ASP 中,您可以尝试:

    string searchQuery = Request.QueryString["q"];
    searchQuery = searchQuery.Replace("*", "%").Replace("?", "_");
    // perform your query as normal
    

    虽然,这两种方法都不是超短的,但它们确实使它更易于阅读,并且不会为您的数据库查询增加任何时间。此外,在查询之前进行替换将允许您在清理字符串之前进行替换,因此您不需要像在现有查询中那样替换 \ - 这样可以节省一次替换!

    【讨论】:

    • 事实上,模式是一个可以是 MySQL 格式的任何值。为了简单起见,这种模式可以是 CONCAT(X),而 X 在 MySQL 中是任何可能的东西(udf 调用和字符串和字段的混合)。因此,我认为您最接近使用 UDF 的良好解决方案。
    猜你喜欢
    • 2016-01-25
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2015-04-22
    • 2020-01-17
    • 2014-07-02
    • 2017-07-08
    相关资源
    最近更新 更多