我需要生成一个具有给定范围的连续整数数组,以便在以下位置使用它:
SELECT tbl.pk_id
FROM tbl
WHERE tbl.pk_id NOT IN (sequential array);
答案 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