Oracle: регулярное выражение для сложного случая - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть таблица, и один из столбцов содержит строку с элементами, разделенными точками с запятой (;)

Я хочу выборочно перенести данные в новую таблицу на основе шаблона String.

Например, это может выглядеть как

16 ;; 14; 30; 24; 11; 13; 14; 14; 10; 13; 18; 15; 18; 24;13/18; 11 23 ;;; 12 19 ;;; 10 ;;: 11; 26 42 ;;;; 26; 38/39; 12 11 ;;;;;;; ;;;;;;;;;;;;;;;

или

11 ;; 11; 11; 11; 11; 11; 11; 11; 11; 11; 11; 11; 11; 11; 11; 11; 11; 11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Мне не важно, что находится между точками с запятой, но мне важно, какие позиции содержат элементы.Например, если я хочу, чтобы только 1-я, 3-я, 4-я позиции содержали элементы, я бы разрешил следующее ...

32 ;; 14; 18/12 ;;;;;;;;;;или 32 ;; 14; 18/12 ;;;; 55 ;;;; 11 ;;;;;;;

Этот внизу не подходит, потому что третья позиция не удерживаетзначение.

32 ;;; 18/12 ;;;;;;;;;

Если для этого работает регулярное выражение, то я могу использовать merge into дляпереместить нужные записи в целевую таблицу.Если это невозможно, мне придется обрабатывать каждую запись в Java и выборочно вставлять записи в новую таблицу.

исходная таблица:

id | StringValue | count

целевая таблица:

id | StringValue | count

sql, который я имею в виду:

merge into you_target_table tt
using ( select StringValue, count
        from source_table where REGEXP_LIKE ( StringValue, 'some pattern')
      ) st
on ( st.StringValue = tt.StringValue and st.count=tt.count )
when not matched then
   insert (id, StringValue , count) 
   values (someseq.nextval, st.value1, st.count)
when matched then
   update
   set tt.count = tt.count + st.count;

Также я уверен, что все StringValue в исходной таблице уникальны, так что то, что после when matched then не важно, но из-зак синтаксису, я думаю, что я должен что-то иметь.

1 Ответ

0 голосов
/ 29 декабря 2018

Для каждой позиции требуется значение [^;]+;, которое соответствует любому символу, но не ; и встречается как минимум один раз, за ​​которым следует ;.Если вам не нужна позиция, поставьте [^;]*;.Это почти аналогично первому, но символы, стоящие до ;, также могут быть ничем.Прикрепите все это к началу с помощью ^.

Так что для примера с 1-й, 3-й и 4-й позицией вы получите:

^[^;]+;[^;]*;[^;]+;[^;]+;

В запросе, который будет выглядеть как:

SELECT *
       FROM elbat
       WHERE regexp_like(nmuloc, '^[^;]+;[^;]*;[^;]+;[^;]+;');

db <> fiddle

Это может быть улучшено, если поместить подвыражения в группу, то есть поместить вокруг них скобки и использоватькванторы - число в фигурных скобках после группы.Например, ([^;]+;){2} будет соответствовать двум не пустым позициям.Ваш пример будет сокращен до:

^[^;]+;[^;]*;([^;]+;){2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...