Суммируйте несколько регулярных выражений в SQL - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть строковый столбец со значениями, которые я извлекаю с помощью регулярных выражений. Шаблон: \d{2}/\d{2}/\d{4}-([\d,.]+)

Есть несколько значений, которые соответствуют этому шаблону, и я хотел бы извлечь и сложить все из них в Oracle SQL.

Например: «текст 100 текст 200 текст». Результат: 300.

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Как насчет этого?

SQL> with
  2  test (col) as
  3    (select 'text 100 text 200 text whatever 20' from dual),
  4  tsplit as
  5    (select regexp_substr(col, '[^ ]+', 1, level) val
  6     from test
  7     connect by level <= regexp_count(col, ' ') + 1
  8    )
  9  select sum(val) result
 10  From tsplit
 11  where regexp_like(val, '^\d+$');

    RESULT
----------
       320

SQL>

Что он делает?

  • строки # 1 - 3: пример данных
  • строки # 4 - 8 разбивает образец строки на строки - каждое «слово» в свою строку
  • окончательные select суммы чисел c значения (строка № 9), которые являются числами (regexp_like)

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

1 голос
/ 27 февраля 2020

Вы можете использовать CONNECT BY LEVEL Оператор:

WITH t2 AS
(
  SELECT DISTINCT ID, regexp_substr(str,'[0-9]+',1,level) AS NMR
    FROM t
 CONNECT BY level <= regexp_count(str,'[0-9]+')
)
SELECT SUM(NVL(NMR,0)) AS "Numeric Result"
  FROM t2

вместе с функциями regexp_substr() и regexp_count() при условии, что у вас есть столбец первичного ключа (ID)

Если вы необходимо агрегирование по строкам, затем рассмотрите возможность использования GROUP BY ID для основного запроса:

SELECT ID, SUM(NVL(NMR,0)) AS "Numeric Result"
  FROM t2
 GROUP BY ID 

Демо

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