是否有一个SQL函数可以生成给定范围的序列号?

时间:2011-03-31 02:22:03

标签: sql informix auto-increment

我需要生成一个具有给定范围的连续整数数组,以便在以下位置使用它:

SELECT tbl.pk_id
  FROM tbl
 WHERE tbl.pk_id NOT IN (sequential array);

4 个答案:

答案 0 :(得分:3)

如果你有一个给定的范围 - 即起点和终点 - 你应该能够使用BETWEEN关键字:

SELECT tbl.pk_id
  FROM tbl
 WHERE tbl.pk_id NOT BETWEEN START_INT AND END_INT

或者我误解了你的问题..?

答案 1 :(得分:1)

两个想法。 。

首先,没有标准的SQL函数可以做到这一点。但是有些系统包含一个非标准函数,它确实生成一系列函数。例如,在PostgreSQL中,您可以使用generate_series()函数。

select generate_series(1,100000);
1
2
3
...
100000

该函数实质上返回一个表;它可以在连接中使用。

如果Informix没有类似的功能,也许你可以编写一个Informix SPL函数。

其次,你可以创建一个单列表并用一系列整数填充它。这适用于所有平台,不需要编程。它只需要很少的维护。 (您需要在此表中保留比在生产表中使用的更多的整数。)

create table integers (
    i integer primary key
);

使用电子表格或实用程序生成一系列整数来填充它。如果您有Unix,Linux或Cygwin环境,最简单的方法是使用seq

$ seq 1 5 > integers
$ cat integers
1
2
3
4
5

Informix有free developer version你可以下载。也许你可以用它构建一个引人注目的演示,管理层会让你升级。

答案 2 :(得分:1)

因为你说你已经有了一个数字表,我建议你这样做:

SELECT element
FROM series
WHERE element NOT IN (SELECT pk_id
                      FROM tbl)

可能比您尝试的查询更有效。

答案 3 :(得分:0)

我将建议一个通用的解决方案来创建一个结果集,其中包含给定k的正整数0 ... 2 ^ k-1,以便随后用作子查询,视图或物化视图。 下面的代码说明了k = 2的技术。

SELECT bv0 + 2* bv1 + 4*bv2   val
  FROM (
        SELECT *
          FROM 
                             (
                                SELECT 0 bv0 FROM DUAL
                                 UNION
                                SELECT 1 bv0 FROM DUAL
                             ) bit0
                 CROSS JOIN  (
                                SELECT 0 bv1 FROM DUAL
                                 UNION
                                SELECT 1 bv1 FROM DUAL
                             ) bit1
                 CROSS JOIN  (
                                SELECT 0 bv2 FROM DUAL
                                 UNION
                                SELECT 1 bv2 FROM DUAL
                             ) bit2
      ) pow2
;

我希望能帮助你完成任务

最好的问候,

的Carsten