Эквивалентность RLIKE/REGEXP и LIKE - сопоставление всей строки с произвольной подстрокой
У меня есть два запроса.
SELECT count(AlbumID)
FROM album
WHERE albumname like '%[%]';
Результат: 15733
SELECT count(AlbumName)
FROM album
WHERE AlbumName RLIKE '.*\\[.*\\]';
Результат: 15740
Итак, как вы можете видеть, как возвращает 7 элементов меньше, чем rlike. У меня есть два вопроса, почему это? Разве заявления не совпадают? И если я ищу имена, которые содержат, скажем, Result: Artist - Song [Live]
или же Result: Artist- Song [Gold CD, Excplicit Lyrics]
какой запрос вернул бы правильный результат?
1 ответ
Решение
Точная эквивалентность
LIKE '%[%]'
является
REGEXP '^.*\\[.*\\]$'
(обратите внимание, что RLIKE - это просто синоним mSQL REGEXP). Короче говоря, это означает, что LIKE
всегда соответствует всей строке, в то время как REGEXP
а также RLIKE
может соответствовать любой подстроке.
Вот почему я бы предположил, что, по-видимому, существует семь
MyName[abc]plus
или же
MyName [abc]!
Вы можете попытаться определить эти семь записей по
SELECT AlbumName FROM album
WHERE AlbumName RLIKE '.*\\[.*\\]' AND AlbumName NOT RLIKE '^.*\\[.*\\]$';