1

データベースに格納されているフルパスからディレクトリ名のみを抽出する方法。

dirname のみでフィルタリングする別のテーブルにスキャン ファイルを挿入する必要があります。

元。

  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

元。これの dirname だけを検索したいのです/mnt/HD/HD_a2/Watch Me.mp3が、 like を使用すると、このよう/mnt/HD/HD_a2%に返されます。他のdirnameも示しました。

  1. /mnt/HD/HD_a2/ウォッチミー.mp3
  2. /mnt/HD/HD_a2/mymusic/sample.mp3
4

1 に答える 1

3

私の理解が正しければ、ファイルのディレクトリへのフルパスではなく、各ファイルのディレクトリ名を収集しています。

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_indexMySQL の, 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';

実際の例については、このフィドルを確認してください

于 2015-08-24T06:47:18.713 に答える