这是我的查询
SELECT producer FROM producers WHERE producer REGEXP CONCAT('[[:<:]]', 'dell\'', '[[:>:]]')
我用这个替换了 mysql 以使用此处另一个示例中的单词边界。但是现在我遇到了转义撇号的问题,即使有匹配项,它也无法在数据库中找到 dell'。
这是我的查询
SELECT producer FROM producers WHERE producer REGEXP CONCAT('[[:<:]]', 'dell\'', '[[:>:]]')
我用这个替换了 mysql 以使用此处另一个示例中的单词边界。但是现在我遇到了转义撇号的问题,即使有匹配项,它也无法在数据库中找到 dell'。
select count(*) from (select 'dell\'' as c) t where c regexp '[[:<:]]dell\''; -- -> 1
select count(*) from (select 'dell\'' as c) t where c regexp '[[:<:]]dell\'[[:>:]]'; -- -> 0
因此,失败的是尾随边界要求。这是有道理的。引用文档:
这些标记代表单词边界。它们分别匹配单词的开头和结尾。单词是前面或后面没有单词字符的单词字符序列。单词字符是 alnum 类中的字母数字字符或下划线 (
_
)。
由于'
不是单词字符,它不能是单词的结尾,因此[[:>:]]
无法匹配。
我创建了 UDF,它解决了这个问题,只需调用一个函数,您可以根据您的条件设置前缀、后缀和值。
DROP FUNCTION IF EXISTS pp
$$ CREATE FUNCTION pp
(Slist varchar(100)) RETURNS char(100) CHARSET latin1 BEGIN Declare sregex varchar(100); SET slist = 'G'; return Concat('[[:<:]]',Slist,'[[:>:]]'); 结尾;