1

如何仅从存储在数据库中的完整路径中提取目录名。

我需要将扫描文件插入另一个表中,该表将仅按目录名过滤。

前任。

  1. /mnt/HD/HD_a2/看我.mp3
  2. /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/HD/HD_a2/看我.mp3
  2. /mnt/HD/HD_a2/mymusic/sample.mp3
4

1 回答 1

3

如果我的理解是正确的,那么您正在收集每个文件的目录名称,而不是文件目录的完整路径。

以下答案是针对 Oracle 的,我们在其中使用regexp_substr方法。

要获取带有目录名称的完整路径,我们可以使用以下正则表达式:

substr(REGEXP_SUBSTR(c1,'^(.*/)*'),0,instr(REGEXP_SUBSTR(c1,'^(.*/)*'),'/',-1)-1)

要仅获取目录名称,我们可以使用以下正则表达式:

replace(regexp_substr(substr(REGEXP_SUBSTR(c1,'^(.*/)*'),0,instr(REGEXP_SUBSTR(c1,'^(.*/)*'),'/',-1)-1),'/[a-zA-Z_0-9]+$'),'/','')

c1是我最后使用的示例列。

因此,您更新后的查询将是这样的:

INSERT INTO tbl_transcode (file_id) 
Select file_id from tbl_files where UPPER(file_path) = upper(substr(REGEXP_SUBSTR(source_path,'^(.*/)*'),0,instr(REGEXP_SUBSTR(source_path,'^(.*/)*'),'/',-1)-1)) and media_type = 'video';

你也可以检查这个sqlfiddle

更新(特定于 MySQL 的答案):

我们可以利用 MySQL 中的substring_index,locate​​ &substring方法来实现目录名的提取。

substring_index方法从字符出现的次数返回子字符串。这里感兴趣的字符是/。因此,调用substring_index(c1,'/',-1)从给定的 dir 路径返回文件名。

接下来我们可以使用locate查找文件名的位置索引并使用substr.

要获取文件名:

SELECT substring_index(c1,'/',-1) FROM t1;

要获取具有完整路径的目录名称:

SELECT substring(c1,1,locate(substring_index(c1,'/',-1),c1)-1) FROM t1;

仅获取目录名称:

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';

检查this fiddle以获得一个工作示例

于 2015-08-24T06:47:18.713 回答