我有一个查询,它应该找到忽略大小写和特殊字符的匹配行,这些字符可能同时存在于查询和相应的列中。为此,我像这样使用 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
的每个值。它很慢,因为
- 不是sargable由于
WHERE f(column) LIKE whatever
,和 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/