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
的每个值。它很慢,因为
- 它不是 sargable,因为
WHERE f(column) LIKE whatever
,并且
column LIKE '%something%'
需要查看 column
的每个值,而不是随机访问 BTREE index.
如果你建立一个数据库来扩展,你设计它以便你的查询可以被搜索。 Sargability 这里可能看起来像
WHERE cleaned_up_reference
LIKE CONCAT(REGEXP_REPLACE(:search, '[^a-zA-Z0-9äöüÄÖÜ]', ''), '%')
没有 右侧的前导 %
,并且没有评估正在搜索的一个或多个列上的任何函数。
我有一个查询,它应该找到忽略大小写和特殊字符的匹配行,这些字符可能同时存在于查询和相应的列中。为此,我像这样使用 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
的每个值。它很慢,因为
- 它不是 sargable,因为
WHERE f(column) LIKE whatever
,并且 column LIKE '%something%'
需要查看column
的每个值,而不是随机访问 BTREE index.
如果你建立一个数据库来扩展,你设计它以便你的查询可以被搜索。 Sargability 这里可能看起来像
WHERE cleaned_up_reference
LIKE CONCAT(REGEXP_REPLACE(:search, '[^a-zA-Z0-9äöüÄÖÜ]', ''), '%')
没有 右侧的前导 %
,并且没有评估正在搜索的一个或多个列上的任何函数。