如何从存储在数据库中的完整路径中只提取目录名。
我需要将扫描文件插入到另一个表中,该表将仅按目录名进行筛选。
例如
1./mnt/高清/高清_a2/观看我的视频. mp3
- /mnt/HD/HD_a2/mymusic/sample.mp3
- 存储在tbl_files中的完整路径
INSERT INTO tbl_transcode (file_id) Select file_id from tbl_files where UPPER(file_path) Like CONCAT((Select source_path from tbl_transcode_folder where trancode_folder_id = 1 ),'%') and media_type = 'video'
但是我只需要dirname来插入tbl_transcode
,我认为LIKE
不好用。
例如,我只想搜索这个/mnt/HD/HD_a2/Watch Me.mp3
的目录名,但当我使用/mnt/HD/HD_a2%
时,它会像这样返回我。其中还显示了其他目录名。
1./mnt/高清/高清_a2/观看我的视频. mp3
- /mnt/HD/HD_a2/mymusic/sample.mp3
2条答案
按热度按时间mkshixfv1#
如果我的理解是正确的,您收集的是每个文件的目录名,而不是文件目录的完整路径。
以下答案特定于Oracle,其中我们使用
regexp_substr
方法。要获取包含目录名的完整路径,我们可以使用以下正则表达式:
要只获取目录名,我们可以使用以下正则表达式:
这里的
c1
是我在这里使用的示例列。因此,您的更新查询将如下所示:
您还可以检查此sqlfiddle
更新(针对MySQL的答案):
我们可以利用MySQL中的
substring_index
、locate
和substring
方法来实现目录名的提取。substring_index
方法从字符出现的次数返回子字符串,这里我们感兴趣的字符是/
,所以调用substring_index(c1,'/',-1)
会从给定的目录路径返回文件名。接下来,我们可以使用
locate
查找文件名位置的索引,并使用substr
获取文件名开始处的子字符串。要获取文件名:
SELECT substring_index(c1,'/',-1) FROM t1;
要获取包含完整路径的目录名:
x1米11米1x
要仅获取目录名:
SELECT substring_index(substring(c1,1,locate(substring_index(c1,'/',-1),c1)-2),'/',-1) FROM t1;
因此,在更新查询您的情况下将如下所示:
INSERT INTO tbl_transcode (file_id) Select file_id from tbl_files where UPPER(file_path) = upper(substring_index(substring(source_path,1,locate(substring_index(source_path,'/',-1),source_path)-2),'/',-1)) and media_type = 'video';
检查这个小提琴的工作示例
rjee0c152#
对我有效:
我觉得这可能有用,就试了一下。我以为我知道为什么,但当我开始解释时,我意识到没有理由。