Oracle SQL для поиска последовательных чисел из числового поля - PullRequest
0 голосов
/ 19 октября 2018

У меня есть номер (число (15,0)) столбца в таблице.Я хочу видеть все записи, имеющие последовательность последовательных чисел, например, 123, 5678, 654321 и все такие возможные последовательности в этом столбце.Какой будет лучший SQL?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Oracle SQL поддерживает функции регулярных выражений , используйте что-то вроде: ^(?=\d{15}$)0?1?2?3?4?5?6?7?8?9? на основе: Регулярное выражение для сопоставления числовой последовательности?

Я не очень хорош вRegex, и я не знаю точно, почему вы это делаете, поэтому не могу дать лучшего решения.

0 голосов
/ 19 октября 2018

Подхватывая идею @ RThomas здесь (upvoted!): Наличие таблицы, содержащей все последовательности, которые вы хотите обнаружить, и запись внутреннего соединения в таблицу, которую вы хотите проверить.Может быть, вам пригодятся следующие фрагменты кода (протестировано с Oracle 12c).

Таблица, которая будет содержать все соответствующие шаблоны.

drop table patterns ;

create table patterns (
  pattern number primary key
);

Анонимный блок (выполняется один раз)

-- find patterns in the 2 constants (ascending/descending)
-- and insert them into the patterns table
declare
  ascpattern constant char( 9 ) := '123456789' ;
  descpattern constant char( 9 ) := '987654321' ;
begin
  for length in 2 .. 9 
  loop
    for offset in 1 .. 8 
    loop
      if length + offset <= 10 then
        -- dbms_output.put_line ( substr( ascpattern, offset, length ) ) ;
        -- dbms_output.put_line ( substr( descpattern, offset, length ) ) ;
        insert into patterns ( pattern ) 
          values ( to_number( substr( ascpattern, offset, length ) ) ) ;
        insert into patterns ( pattern ) 
          values ( to_number( substr( descpattern, offset, length ) ) ) ;
      end if ;
    end loop ;
  end loop ;
end ;
/

Таблица шаблонов

select * from patterns ;

   PATTERN
----------
        12  -- contained in ascpattern
        21  -- contained in descpattern
        23
        32
        34
...
   9876543
  12345678  -- contained in ascpattern
  23456789  -- contained in ascpattern
  87654321  -- contained in descpattern
  98765432  -- contained in descpattern
 123456789  -- contained in ascpattern
 987654321

72 rows selected.

Тестирование: таблица, содержащая 100000 случайных чисел.

drop table randomnumbers ;

create table randomnumbers
as
select trunc( dbms_random.value ( 0, 999999 ) ) randomnumber
from dual
connect by level <= 100000 ;

select * from randomnumbers fetch first 6 rows only ;


RANDOMNUMBER
------------
      529903
      653752
      339231
       42871
      599376
      381709

Обнаружение шаблонов в таблице случайных чисел с помощью внутреннего соединения.(Конечно, ваш набор результатов будет выглядеть иначе.)

select
  pattern
, randomnumber
from patterns P
  join randomnumbers R on P.pattern = R.randomnumber 
order by pattern ;


   PATTERN RANDOMNUMBER
---------- ------------
        76           76
        87           87
       456          456
      3456         3456
     54321        54321
     56789        56789
0 голосов
/ 19 октября 2018

Если бы я собирался заняться этой проблемой, я бы построил таблицу всех числовых последовательностей, которые соответствуют требованиям.Похоже, у вас есть как увеличение, так и уменьшение.В любом случае.Это ограниченное количество.Затем я просто сделал бы внутреннее соединение между интересующим меня столбцом и моей таблицей квалификационных последовательностей.Это позволяет избежать построчных операций и упрощает использование SQL.

Существует несколько способов решить эту проблему с помощью логического кода, причудливых пользовательских функций и т. Д., Но в конце я думаю, что объединение, особенно с использованием правильных индексов,будь лучшим".Я интерпретирую «лучшее» как наиболее эффективное использование ресурсов и скорость возврата.

Там, где это больше не будет масштабироваться, если вы хотите также отображать последовательности в двузначные числа.Т.е. 123456789101112

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