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



我有一个数据库表,其中的文档名称存储为VARCHAR,我需要一种方法来计算最低可用序列号。

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

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

不同名称值总计227705。"部分"组合的数量相当大,A=150,B=218,C=52,因此有1700400个潜在组合。

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

我宁愿有一个基于现有数据的表,它有一个分部值,它是下一个可用的序列值,不存在的分部表示0001。

感谢

嗯,你可以试试这个:

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;

最新更新