SQL:在 LIKE 语句内的查询参数上使用 REGEXP_REPLACE

标签 sql mariadb

我有一个查询,它应该找到忽略大小写和特殊字符的匹配行,这些字符可能同时存在于查询和相应的列中。为此,我像这样使用 REGEXP_REPLACE:

SELECT *
FROM Order
WHERE REGEXP_REPLACE(reference, '[^a-zA-Z0-9äöüÄÖÜ]', '') LIKE %:search%

其中 search 是我要使用的参数的名称。这行得通,但还没有从不需要的特殊字符中清除 search 参数。

我想做的是类似下面的事情,即在右侧也有 REGEXP_REPLACE:

SELECT *
FROM Order
WHERE REGEXP_REPLACE(reference, '[^a-zA-Z0-9äöüÄÖÜ]', '') LIKE %REGEXP_REPLACE(:search, '[^a-zA-Z0-9äöüÄÖÜ]', '')%

但是这不起作用,我收到以下错误:

42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%REGEXP_REPLACE(

是否不能在参数上使用函数或作为 LIKE 语句的一部分?有任何解决方法吗?

最佳答案

您似乎想创建一个以“%”开头和结尾的字符串,以在您的 LIKE 运算符中使用。要在 MySQL 的 SQL 方言中做到这一点,您需要使用内置的字符串操作函数显式地进行字符串操作。

您可以在查询需要文本字符串的任何地方使用这些函数。

尝试使用 CONCAT在这样的表达式中生成该字符串。您可以在“赞”的右侧使用它。

CONCAT('%', REGEXP_REPLACE(:search, '[^a-zA-Z0-9äöüÄÖÜ]', ''), '%')

我希望您不希望查询速度过快。它会很慢。它必须检查表中 Order.reference 的每个值。它很慢,因为

  1. 不是sargable由于WHERE f(column) LIKE whatever,和
  2. column LIKE '%something%' 需要查看 column 的每个值,而不是随机访问 BTREE index .

如果您构建一个数据库以进行扩展,那么您将对其进行设计以使您的查询可以被搜索。这里的可销售性可能看起来像

WHERE cleaned_up_reference 
 LIKE CONCAT(REGEXP_REPLACE(:search, '[^a-zA-Z0-9äöüÄÖÜ]', ''), '%')

没有右侧的前导 %,并且没有对正在搜索的一个或多个列计算任何函数。

关于SQL:在 LIKE 语句内的查询参数上使用 REGEXP_REPLACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70363383/

相关文章:

sql - 如何在 SQL 准备语句中转义单引号和双引号?

sql - 从字符串中删除空格并选择在 sql server 中使用该字符串

mysql - 寻找 MariaDB 的 COLUMN_ADD 函数的 PHP 或 MySQL 等价物

mysql - MySQL UPDATE 的 WHERE 子句中的条件无效 - 更新了所有内容 - 而不是没有

MySql 从两个表中选择数据,不使用 join,而是使用单个 where 条件

sql - Select count(*)是否不返回SQLite中结果为0的行?

php - 为什么要使用 num_rows

mysql - 我正在努力准备好声明,其中

python - python项目中的Liquibase集成

mariadb - 无法在 manjaro 上启动 mariaDB