如何在oracle字符串字段中查找下一个序列号

时间:2015-12-07 21:02:16

标签: sql oracle view oracle11g sql-view

我有一个数据库表,文档名称存储为VARCHAR,我需要一种方法来确定最低可用序列号是什么。有很多差距。

name          partial    seq
A-B-C-0001    A-B-C-     0001
A-B-C-0017    A-B-C-     0017

在上面的示例中,它将是0002。

不同的名称值总计227,705。 “部分”组合的数量非常大A = 150,B = 218,C = 52,因此有1,700,400种潜在组合。

我找到了一种方法,可以从每个不同的值的最小值到最大值进行迭代,并列出所有“缺失”(也称为可用)值,但这似乎效率低,因为我们没有使用接近最大潜在部分组合的任何地方(10,536个) 1,700,400)。

我宁愿根据具有部分值的现有数据创建一个表,它是下一个可用的序列值,而不存在的部分意味着0001。

由于

1 个答案:

答案 0 :(得分:0)

嗯,你可以试试这个:

select coalesce(min(to_number(seq)), 0) + 1
from t
where partial = 'A-B-C-' and
      not exists (select 1
                  from t t2
                  where t2.partial = t.partial and
                        to_number(T2.seq) = to_number(t.seq) + 1
                 );

编辑:

对于所有部分内容,您需要group by

如有必要,您可以使用to_char()将其转换回字符。

select partial, coalesce(min(to_number(seq)), 0) + 1
from t
where not exists (select 1
                  from t t2
                  where t2.partial = t.partial and
                        to_number(T2.seq) = to_number(t.seq) + 1
                 )
group by partial;