Существует ли функция SQL, которая генерирует заданный диапазон последовательных чисел? - PullRequest
1 голос
/ 31 марта 2011

Мне нужно сгенерировать массив последовательных целых чисел с заданным диапазоном, чтобы использовать его в:

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

Ответы [ 4 ]

3 голосов
/ 31 марта 2011

Если у вас есть заданный диапазон - то есть начальная и конечная точка - последовательных целых чисел, вы должны просто иметь возможность использовать ключевое слово BETWEEN:

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

или я неправильно понимаю ваш вопрос..

1 голос
/ 31 марта 2011

Поскольку вы говорите, что у вас уже есть таблица чисел, я бы предложил:

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

Возможно, будет более эффективным, чем запрос, который вы пробовали.

1 голос
/ 31 марта 2011

Две мысли.,.

Во-первых, нет стандартной функции 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 имеет бесплатную версию для разработчиков , которую вы можете загрузить.Может быть, вы сможете создать убедительную демонстрацию с его помощью, и руководство позволит вам обновить.

0 голосов
/ 31 марта 2011

Я предложу общее решение для создания результирующего набора, содержащего положительные целые числа 0 .. 2 ^ k-1 для данного k для последующего использования в качестве подзапроса, представления или материализованного представления.приведенный ниже код иллюстрирует методику для 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
;

Я надеюсь, что это поможет вам в вашей задаче

С наилучшими пожеланиями,

Карстен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...