В DB2 SQL RegEx, как можно выполнить условную замену без CASE WHEN END ..? - PullRequest
1 голос
/ 21 марта 2019

У меня есть оператор SQL SELECT DB2 v7r3 с тремя экземплярами REGEXP_SUBSTR (), все с одинаковой строкой шаблона регулярного выражения, каждая из которых извлекает одну из трех групп.

Я бы хотел изменить первый SUBSTR на REGEXP_REPLACE (), чтобы выполнить условную замену, если совпадений нет, чтобы вставить значение по умолчанию, аналогичное разделу ELSE в CASE ... END. Но я не могу заставить это работать. Я мог бы легко использовать CASE, но он кажется более компактным и эффективным для использования RegEx.

Например, у меня есть описания размеров пищевых контейнеров в различных состояниях полноты:

  • 12X125
  • 6X350
  • 1X1500
  • 1500ml
  • 1000

Последние два не имеют части 'nnX' в начале, в этом случае подразумевается '1X', и ее необходимо вставить.

Это моя текущая рабочая строка шаблона:

^(?:(\d{1,3})(?:X))?((?:\d{1,4})(?:\.\d{1,3})?)(L|ML|PK|Z|)$

Возвращаемые группы: количество, размер и единица измерения.

Но только первая группа нуждается в условной замене:

(?:(\d{1,3})(?:X))?

Эта веб-страница RexEgg описывает оператор (?=...), и, похоже, это то, что мне нужно, но я не уверен. Он находится в списке операторов для моей версии DB2, но я не могу заставить его работать. Честно говоря, это немного глубже, чем мои знания регулярных выражений, и я даже не могу заставить его работать в моем любимом онлайн-тестере регулярных выражений, Regex101 .

Так ... у кого-нибудь есть идеи или предложения ..? Спасибо.

1 Ответ

3 голосов
/ 21 марта 2019

Попробуйте это (замените «цифры, за которыми не следует X_or_digit»):

with t(s) as (values
  '12X125'
, '6X350'
, '1X1500'
, '1500'
, '1125'
)
select regexp_replace(s, '^([\d]+(?![X\d]))', '1X\1')
from t;
...