在 DB2 SQL RegEx 中,如何在没有 CASE WHEN END.. 的情况下完成条件替换?

In DB2 SQL RegEx, how can a conditional replacement be done without CASE WHEN END..?

我有一个 DB2 v7r3 SQL SELECT 语句,其中包含三个 REGEXP_SUBSTR() 实例,所有实例都具有相同的正则表达式模式字符串,每个都提取三个组中的一个。

我想将第一个 SUBSTR 更改为 REGEXP_REPLACE() 以在不匹配时进行条件替换,以类似于 CASE...END 的 ELSE 部分插入默认值。但我无法让它发挥作用。我可以很容易地使用 CASE,但使用 RegEx 似乎更紧凑和高效。

例如,我有食品容器尺寸的描述,处于各种完整性状态:

最后两个没有开头的'nnX'部分,在这种情况下假定'1X'并且需要插入。

这是我当前的工作模式字符串:

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

返回的组是:数量、尺寸和单位。

但只有第一组需要条件替换:

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

这个 RexEgg webpage describes the (?=...) operator, and it seems to be what I need, but I'm not sure. It's in the list of operators for my version of DB2, but I can't make it work. Frankly, it's a bit deeper than my regex knowledge, and I can't even make it work in my favorite online regex tester, Regex101

所以...有人有任何想法或建议吗..?谢谢。

试试这个(替换 "digits not followed by X_or_digit"):

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