私の理解が正しければ、ファイルのディレクトリへのフルパスではなく、各ファイルのディレクトリ名を収集しています。
regexp_substr
次の回答は、メソッドを利用するOracleに固有のものです。
ディレクトリ名のフル パスを取得するには、次の正規表現を使用できます。
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 に固有の回答):
substring_index
MySQL の, locate
&メソッドを使用してsubstring
、ディレクトリ名の抽出を実現できます。
このsubstring_index
メソッドは、文字の出現回数から部分文字列を返します。ここで対象の文字は です/
。したがって、呼び出すsubstring_index(c1,'/',-1)
と、指定されたディレクトリ パスからファイル名が返されます。
次に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';
実際の例については、このフィドルを確認してください