0

我有一个带有字段、文件名的视频表,其中一些视频被分成多个部分,视频部分的起始帧号附加到文件名的末尾,以“_”分隔。

我想获得代表每个文件名的起始帧的整数,例如:

movie.avi : frame=0
movie_500.avi: frame=500

对于上面的两个文件,我可以在我的表上使用正则表达式来获取它:

SELECT coalesce(substring(filename FROM '_(\d{2,7}).avi$')::int, 0) FROM table;

但是,如何处理视频文件名末尾可能包含数字的情况。假设我有两个文件:

anothermovie_100.avi: frame = 100 (WRONG!)
anothermovie_100_500.avi: frame = 500

我上面的选择语句会给我错误的帧起始编号。我想通过查看我的表知道 anothermovie_100 的 frame=0 因为在同一个表中存在另一个文件名,其中包含 anothermovie_100 并在最后以三位数结束。

所以基本上对于具有上述四行的表,我希望我的 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. 你怎么知道(不管 SQL 语法,只是用简单的英语)movie_500.avi实际上是 500 帧movie.avi还是 0 帧movie_500_500.avi

于 2013-10-04T11:00:31.417 回答