【问题标题】:Extract dirname from full path stored in database从存储在数据库中的完整路径中提取目录名
【发布时间】:2015-11-17 10:36:37
【问题描述】:

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

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

例如

  1. /mnt/HD/HD_a2/Watch Me.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/Watch Me.mp3
  2. /mnt/HD/HD_a2/mymusic/sample.mp3

【问题讨论】:

    标签: mysql sql database sql-like dirname


    【解决方案1】:

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

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

    也可以查看thissqlfiddle

    更新(针对 MySQL 的答案):

    我们可以利用MySQL中的substring_indexlocatesubstring方法来实现目录名的提取。

    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 以获取工作示例

    【讨论】:

    • 我实际使用的是sql查询,在orale中使用有什么不同的语法吗?我试过了,但没有什么好发生,给我一个错误#1582 - Incorrect parameter count in the call to native function 'instr' 我想要的是这样我有一个数据库列,它存储了这样的完整路径/mnt/HD/HD_a2/mymusic/sample.mp3 但我只需要获取它的目录名,不包括这样的基本名@ 987654342@.
    • @Amboom 你在用 MySQL 吗?某些 SQL 查询和方法的语法会在数据库之间发生变化。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2010-10-14
    • 2015-01-21
    • 2011-01-02
    • 2019-02-24
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多