MySQL在计算列内短语的准确出现时抛出错误"Error Code: 3685. Illegal argument to a regular expression"



正如我在Q-title中提到的,现在MySQL已经大量升级到版本8,预期提供了许多新功能,包括缩短字符的词边界匹配,计算准确的出现在列内的短语,其中一个行-列(单元格)可能包含多个搜索词/短语的出现必须变得更容易实现。

然而,当我使用这个正确的查询来计算字符串的确切出现次数时,它会抛出以下给定的错误:

SELECT 
ROUND((LENGTH(`column_name`) - LENGTH(REGEXP_REPLACE(`column_name`,
"^[[:<:]]Home Depot[[:>:]]$",
''))) / LENGTH('Home Depot')) AS `found`
FROM
<DB>.<TableName>;

如果有2行,如下所示:

Home Depot is a good one but Home Depot
Home Depot is a bad one

那么它必须返回found(总出现次数)为3,而不是仅仅返回no。第2行。相反,它抛出错误:Error Code: 3685. Illegal argument to a regular expression.

如果我使用\b而不是[[:<:]],那么它给出了1000000的数列,这当然是错误的计数,因为整个表中没有那么多行,所以它只是Regex引擎搞砸了。

有人愿意帮我实现我想要的吗?

您需要将单词边界更改为\b。要在字符串中的任何位置匹配Home Depot,必须删除^$锚。最后,要获得替换的总数,必须使用SUM()将每行中的值相加。

我认为你不需要使用ROUND(),因为分子应该始终是分母的精确倍数。

把它们放在一起:

SELECT SUM((LENGTH(`column_name`) - 
LENGTH(REGEXP_REPLACE(`column_name`, "\bHome Depot\b", ''))) 
/ LENGTH('Home Depot')) AS found
FROM db.tablename

最新更新