Oracle SQL Как использовать Regex для построения строки? - PullRequest
0 голосов
/ 02 мая 2019

Используя Oracle SQL, как я могу создать новую строку из столбца большего размера?

Например, скажем, у нас есть:

example-dev5-ex1-ex2

в качестве столбца.Я хочу превратить это в:

example-dev5.ex0.ex1.ex2.

ex0 - это жестко закодированное значение, которое мне нужно ввести в строку.Среда разработки также может быть dev10, dev11 и т. Д. Итак, еще одна цифра в конце dev.

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

1 Ответ

4 голосов
/ 02 мая 2019

Если вы просто хотите заменить суффиксы -ex?? так, чтобы к ним всегда добавлялись последовательные суффиксы .ex0 ... .ex??, используйте регулярное выражение:

^([^-]*-[^-]*).*-ex(\d+)$

Чтобы соответствовать началустроки ^, затем первые два термина, разделенных дефисом ([^-]*-[^-]*), затем прочитайте остальные символы .* до последнего термина -ex(\d+) в конце строки $.

Затем вы можете использовать первые два термина и последний термин в рекурсивном предложении факторинга подзапроса для генерации последовательных суффиксов, пока не достигнете правильной глубины:

Установка Oracle :

CREATE TABLE test_data( value ) AS
  SELECT 'example-dev5-ex1-ex2'   FROM DUAL UNION ALL
  SELECT 'example1-dev10-ex3'     FROM DUAL UNION ALL
  SELECT 'example2-dev99-ex2-ex7' FROM DUAL;

Запрос :

WITH rsqfc ( value, max_depth, depth ) AS (
  SELECT REGEXP_SUBSTR( value, '^([^-]*-[^-]*).*-ex(\d+)$', 1, 1, NULL, 1 ) || '.ex0',
         TO_NUMBER( REGEXP_SUBSTR( value, '^([^-]*-[^-]*).*-ex(\d+)$', 1, 1, NULL, 2 ) ),
         0
  FROM test_data
UNION ALL
  SELECT value || '.ex' || (depth+1),
         max_depth,
         depth + 1
  FROM   rsqfc
  WHERE  depth < max_depth
)
SELECT value
FROM   rsqfc
WHERE  depth = max_depth;

Выход :

| VALUE                                          |
| :--------------------------------------------- |
| example-dev5.ex0.ex1.ex2                       |
| example1-dev10.ex0.ex1.ex2.ex3                 |
| example2-dev99.ex0.ex1.ex2.ex3.ex4.ex5.ex6.ex7 |

db <> Fiddle здесь


Если вы просто хотите добавить .ex0 и изменить суффиксы -ex?? на . в начале, вы можете использовать:

Oracle Query :

SELECT REGEXP_SUBSTR( value, '^[^-]*-[^-]*' ) || '.ex0' || REPLACE( REGEXP_SUBSTR( value, '(-ex\d+)+$' ), '-', '.' ) AS value
FROM   test_data

Выход :

| VALUE                      |
| :------------------------- |
| example-dev5.ex0.ex1.ex2   |
| example1-dev10.ex0.ex3     |
| example2-dev99.ex0.ex2.ex7 |

db <> Fiddle здесь

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