Is there an SQL function which generates a given range of sequential numbers?

自古美人都是妖i 提交于 2019-12-02 08:30:26

问题


I need to generate an array of sequential integers with a given range in order to use it in:

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

回答1:


Because you say you've already got a number table, I would suggest this:

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

Might possibly be more efficient than the query you've tried.




回答2:


If you have a given range - ie a start point and an end point - of sequential integers you should just be able to use the BETWEEN keyword:

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

or am I misunderstanding your question..?




回答3:


Two thoughts . . .

First, there's no standard SQL function that does that. But some systems include a non-standard function that does generates a series. In PostgreSQL, for example, you can use the generate_series() function.

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

That function essentially returns a table; it can be used in joins.

If Informix doesn't have a function that does something similar, maybe you can write an Informix SPL function that does.

Second, you could just create a one-column table and populate it with a series of integers. This works on all platforms, and doesn't require programming. It requires only minimal maintenance. (You need to keep more integers in this table than you're using in your production table.)

create table integers (
    i integer primary key
);

Use a spreadsheet or a utility program to generate a series of integers to populate it. The easiest way if you have a Unix, Linux, or Cygwin environment laying around is to use seq.

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

Informix has a free developer version you can download. Maybe you can build a compelling demo with it, and management will let you upgrade.




回答4:


i'll suggest a generic solution to create a result set containing the positive integers 0 .. 2^k-1 for a given k for subsequent use as a subquery, view or materialized view. the code below illustrates the technique for 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
;

i hope that helps you with your task

best regards,

carsten



来源:https://stackoverflow.com/questions/5494687/is-there-an-sql-function-which-generates-a-given-range-of-sequential-numbers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!