我有一个带有字段,文件名的视频表,其中一些视频分为多个部分,视频部分的起始帧编号附加到文件名末尾,以“_”分隔。
我想得到表示每个文件名的起始帧的整数,例如:
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帧而不是文件名的最后一位数字转换为整数。
答案 0 :(得分:1)
我认为这里的问题是对数据进行建模 - 您应该保留对每个文件所属电影的引用。
否则,您的数据可能不明确。假设您有文件movie.avi
和movie_500_500.avi
。您如何判断(无论是SQL语法,只是简单的英语)movie_500.avi
实际上是movie.avi
的500帧还是movie_500_500.avi
的0帧?