フィールド、ファイル名を含むビデオのテーブルがあり、これらのビデオの一部は複数の部分に分割され、ビデオ部分の開始フレーム番号が「_」で区切られたファイル名の末尾に追加されています。
各ファイル名の開始フレームを表す整数を取得したいので、例えば:
movie.avi : frame=0
movie_500.avi: frame=500
上記の 2 つのファイルについては、テーブルで正規表現を使用して取得できます。
SELECT coalesce(substring(filename FROM '_(\d{2,7}).avi$')::int, 0) FROM table;
ただし、動画のファイル名の末尾に数字が含まれる可能性がある場合の対処方法。次の 2 つのファイルがあるとします。
anothermovie_100.avi: frame = 100 (WRONG!)
anothermovie_100_500.avi: frame = 500
上記の select ステートメントでは、間違ったフレーム開始番号が返されます。テーブルを見て、anothermovie_100 が frame=0 であることを知りたいのです。これは、同じテーブルに別のファイル名があり、anothermovie_100 を含み、末尾が 3 桁で終わるためです。
基本的に、上記の 4 つの行を含むテーブルの場合、select ステートメントで次のように指定します。
movie.avi: frame=0
movie_500.avi: frame=500
anothermovie_100.avi: frame=0
anothermovie_100_500.avi: frame=500
そのため、クエリは、ファイル名文字列が同じテーブルの別のファイル名文字列に完全に含まれていないかどうかを何らかの形で知る必要があります。その場合、整数に変換されたファイル名の最後の数字ではなく、フレーム 0 を返す必要があります。