MySQL REGEXP仅匹配给定目录

时间:2015-08-22 11:11:20

标签: mysql regex

考虑数据库条目,路径写为:

Lost & Found\Folder2039937\
   |   Lost & Found\Folder2039909\Folder3012231

Lost & Found\Folder2039909\
   |    Lost & Found\Folder2039909\Folder3012111

(添加视觉效果以澄清结构)

这些与任何外键无关,所以这是我唯一能够继续工作的事情。遗憾的是。

现在,鉴于 Lost&找到路径,我需要查询MySQL的路径Lost&的任何DIRECT子目录。发现。所以结果应该是:

Lost & Found\Folder2039937\
Lost & Found\Folder2039909\

但没有

Lost & Found\Folder2039937\Folder3012231
Lost & Found\Folder2039909\Folder3012111

我不知道,我怎么能用MySQL查询来做到这一点。我尝试过的是写 REGEXP 来获取这些条目,但我无法弄清楚正确的表达方式。我尝试了多种组合,但我对REGEXP完全不了解,并且从未要求使用REGEXP。

REGEXP是我能做到的唯一方法吗?如果是,那么什么是正确的?

4 个答案:

答案 0 :(得分:2)

使用REGEX,类似于:

select *
from paths
where path regexp '^Lost & Found\\\\([^\\]+)\\\\?$'
;

请注意重复的\\\\ - 自\\用于在字符串级别和正则表达式级别转义\时,需要有两个级别。

以下是MySQL的REGEXP文档:https://dev.mysql.com/doc/refman/5.1/en/regexp.html

答案 1 :(得分:0)

也许是一个有趣的选择:

select path
from (
    select
        path,
        substring_index(path, '\\', 1) as part1,
        substring_index(substring_index(path, '\\', 2), '\\', -1) as part2
    from paths
) t
where part1 = 'Lost & Found'
    and part2 <> ''
    and length(concat(part1, part2)) + 1 = length(trim(trailing '\\' from path))
;

您可以拆分斜线并匹配碎片。它有点乱,然后试图检查是否有两件。可能有更好的方法可以做到这一点,但这是我能想到的第一件事。它需要part1和2的长度,它们之间的斜杠加1,并将其与删除尾部斜杠的整个路径的长度进行比较(使其成为可选项)。

我发现SUBSTRING_INDEX过去在处理分隔文本时非常有用,并且MySQL肯定有很多其他字符串操作函数可供选择,它们往往会很长,因为很难“保存”任何中间件。

https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index

答案 2 :(得分:0)

您也可以使用like

执行此操作
where path like 'Lost & Found\\%' and
      path not like 'Lost & Found\\%\\%'

我不确定哪个更快。但是,like表达式可以利用索引,因为它不以通配符开头。所以,在某些情况下,它可能会更快。

答案 3 :(得分:0)

SELECT * from path where (file REGEXP 'Lost & Found\\\\([^\\]+)\\\\([^\\]+)\\\\?$' OR file REGEXP 'Lost & Found\\\\([^\\]+)\\\\?$')

这会得到结果第一级filesfolders

相关问题