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

问题描述 投票:1回答:1

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

我想将第一个SUBSTR更改为REGEXP_REPLACE()以在没有匹配的情况下进行条件替换,以插入与CASE ... END的ELSE部分类似的默认值。但我不能让它发挥作用。我可以轻松使用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 webpage描述了(?=...)算子,它似乎是我需要的,但我不确定。它位于我的DB2版本的operators列表中,但我无法使其工作。坦率地说,它比我的正则表达式知识要深一些,我甚至无法在我最喜欢的在线正则表达式测试器Regex101中使用它。

那么......有没有人有任何想法或建议......?谢谢。

db2 regex-group db2-400
1个回答
3
投票

试试这个(替换“数字后面没有X_or_digit”):

with t(s) as (values
  '12X125'
, '6X350'
, '1X1500'
, '1500'
, '1125'
)
select regexp_replace(s, '^([\d]+(?![X\d]))', '1X\1')
from t;
© www.soinside.com 2019 - 2024. All rights reserved.