【问题标题】:Equivalency of RLIKE/REGEXP and LIKE - matching whole string vs. arbitrary substringRLIKE/REGEXP 和 LIKE 的等价性 - 匹配整个字符串与任意子字符串
【发布时间】:2016-05-29 09:25:32
【问题描述】:

我有两个问题。

SELECT count(AlbumID)
  FROM album
  WHERE albumname like '%[%]';

结果:1​​5733

SELECT count(AlbumName)
  FROM album
  WHERE AlbumName RLIKE '.*\\[.*\\]';

结果:1​​5740

所以你可以看到 like 返回比 rlike 少 7 个元素。我有两个问题为什么会这样?陈述不一样吗?如果我正在寻找包含 Result: Artist - Song [Live]Result: Artist- Song [Gold CD, Excplicit Lyrics] 的名称,那么查询会返回正确的结果吗?

【问题讨论】:

  • SELECT count(AlbumID) FROM album WHERE AlbumName RLIKE '.*\\[.*\\]'; 显示什么?有没有AlbumIDnull? ==> select count(*) from album where AlbumID is nullselect count(*) from album where albumname like '%[%]';的结果是什么
  • @EagleRainbow 第一个查询得到了相同的数字 15740。第二个查询得到的结果是 0,所以没有这样的专辑。第三次查询得到的结果与 AlbumID 计数相同,即 15733。因此不同的选择不会影响结果。你知道这是为什么吗?
  • 执行 SELECT AlbumName FROM album WHERE ... rlike ... AND ... NOT like ... 以查看 7 个神秘行。它们之间有什么共同点?然后回答你自己的问题。

标签: mysql regex sql-like rlike regexp-like


【解决方案1】:

完全等价的

LIKE '%[%]' 

REGEXP '^.*\\[.*\\]$'

(请注意,RLIKE 只是一个mSQL'ish synonym of REGEXP)。简而言之,这意味着LIKE 总是匹配整个字符串,而REGEXPRLIKE 可以匹配任何子字符串。

这就是为什么我会假设周围显然有七个专辑名称

MyName[abc]plus

MyName [abc]!

您可以尝试通过

来确定这七条记录
SELECT AlbumName FROM album 
WHERE AlbumName RLIKE '.*\\[.*\\]' AND AlbumName NOT RLIKE '^.*\\[.*\\]$';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2016-01-23
    • 2013-08-16
    相关资源
    最近更新 更多