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

SQL: Use REGEXP_REPLACE on query parameter inside of LIKE statement

我有一个查询,它应该找到忽略大小写和特殊字符的匹配行,这些字符可能同时存在于查询和相应的列中。为此,我像这样使用 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 语句的一部分使用函数?有什么解决方法吗?

你可以试试这个:

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

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

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

尝试在这样的表达式中使用 CONCAT 来生成该字符串。你可以在你喜欢的右边使用它。

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

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

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

如果你建立一个数据库来扩展,你设计它以便你的查询可以被搜索。 Sargability 这里可能看起来像

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

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