从存储在数据库中的完整路径中提取dirname

时间:2015-08-24 05:23:27

标签: mysql sql database sql-like dirname

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

我需要将扫描文件插入到另一个表中,该表只能通过dirname过滤。

  

离。

     
      
  1. / mnt / HD / HD_a2 / Watch Me.mp3
  2.   
  3. /mnt/HD/HD_a2/mymusic/sample.mp3      
        
    • 存储在tbl_files中的完整路径
    •   
  4.   

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'

但我只需要在tbl_transcode中插入dirname,我认为LIKE不适合使用。

实施例。我只想搜索此/mnt/HD/HD_a2/Watch Me.mp3的dirname,但当我像/mnt/HD/HD_a2%一样使用时,它会像这样返回我。其中也显示了其他名称。

  
      
  1. / mnt / HD / HD_a2 / Watch Me.mp3
  2.   
  3. /mnt/HD/HD_a2/mymusic/sample.mp3
  4.   

1 个答案:

答案 0 :(得分:2)

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

以下答案特定于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';

您还可以查看this sqlfiddle

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

我们可以使用substring_indexlocate&来自MySQL的substring方法来实现dir名称的提取。

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小提琴是否有工作示例