0

フィールド、ファイル名を含むビデオのテーブルがあり、これらのビデオの一部は複数の部分に分割され、ビデオ部分の開始フレーム番号が「_」で区切られたファイル名の末尾に追加されています。

各ファイル名の開始フレームを表す整数を取得したいので、例えば:

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 を返す必要があります。

4

1 に答える 1

1

ここでの問題はデータのモデリングだと思います.各ファイルが属する映画への参照を保持する必要があります.

そうしないと、データがあいまいになる可能性があります。ファイルmovie.avimovie_500_500.avi. movie_500.avi(SQL構文に関係なく、平易な英語で)実際に の500フレームmovie.aviか0フレームかをどのように判断しますmovie_500_500.aviか?

于 2013-10-04T11:00:31.417 に答える