Эквивалентность 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 '^.*\\[.*\\]$';
Другие вопросы по тегам