考虑数据库条目,路径写为:
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是我能做到的唯一方法吗?如果是,那么什么是正确的?
答案 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\\\\([^\\]+)\\\\?$')
这会得到结果第一级files
和folders