如果我的理解是正确的,那么您收集的是每个文件的目录名,而不是文件目录的完整路径。
以下答案是特定于 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_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 以获取工作示例