gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:40:00 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com