RLIKE/REGEXP 和 LIKE 的等效性 - 匹配整个字符串与任意子字符串
Equivalency of RLIKE/REGEXP and LIKE - matching whole string vs. arbitrary substring
我有两个问题。
SELECT count(AlbumID)
FROM album
WHERE albumname like '%[%]';
结果:15733
SELECT count(AlbumName)
FROM album
WHERE AlbumName RLIKE '.*\[.*\]';
结果:15740
所以你可以看到 like returns 比 rlike 少了 7 个元素。我有两个问题,为什么会这样?语句不一样吗?如果我正在寻找包含 Result: Artist - Song [Live]
或 Result: Artist- Song [Gold CD, Excplicit Lyrics]
的名称,那么查询 return 正确的结果是什么?
的确切等价性
LIKE '%[%]'
是
REGEXP '^.*\[.*\]$'
(注意 RLIKE 只是一个 mSQL'ish synonym of REGEXP)。简而言之,这意味着 LIKE
总是匹配整个字符串,而 REGEXP
和 RLIKE
可能匹配任何子字符串。
这就是为什么我会假设周围显然有七个 AlbumNames
MyName[abc]plus
或
MyName [abc]!
您可以尝试通过
来确定这七条记录
SELECT AlbumName FROM album
WHERE AlbumName RLIKE '.*\[.*\]' AND AlbumName NOT RLIKE '^.*\[.*\]$';
我有两个问题。
SELECT count(AlbumID)
FROM album
WHERE albumname like '%[%]';
结果:15733
SELECT count(AlbumName)
FROM album
WHERE AlbumName RLIKE '.*\[.*\]';
结果:15740
所以你可以看到 like returns 比 rlike 少了 7 个元素。我有两个问题,为什么会这样?语句不一样吗?如果我正在寻找包含 Result: Artist - Song [Live]
或 Result: Artist- Song [Gold CD, Excplicit Lyrics]
的名称,那么查询 return 正确的结果是什么?
LIKE '%[%]'
是
REGEXP '^.*\[.*\]$'
(注意 RLIKE 只是一个 mSQL'ish synonym of REGEXP)。简而言之,这意味着 LIKE
总是匹配整个字符串,而 REGEXP
和 RLIKE
可能匹配任何子字符串。
这就是为什么我会假设周围显然有七个 AlbumNames
MyName[abc]plus
或
MyName [abc]!
您可以尝试通过
来确定这七条记录SELECT AlbumName FROM album
WHERE AlbumName RLIKE '.*\[.*\]' AND AlbumName NOT RLIKE '^.*\[.*\]$';