在DB2 SQL正则表达式中,如何在没有CASE WHEN END..的情况下进行条件替换。。?

在DB2 SQL正则表达式中,如何在没有CASE WHEN END..的情况下进行条件替换。。?,db2,regex-group,db2-400,Db2,Regex Group,Db2 400,我有一个DB2V7R3SQLSELECT语句,其中包含三个REGEXP_SUBSTR()实例,所有实例都具有相同的regex模式字符串,每个字符串提取三个组中的一个 我想将第一个子字符串更改为REGEXP_REPLACE(),以便在不匹配的情况下进行条件替换,插入一个与CASE…END的ELSE部分类似的默认值。但我不能让它工作。我可以很容易地使用CASE,但使用RegEx似乎更紧凑、更高效 例如,我有各种完整状态下食品容器尺寸的描述: 12X125 6X350 1X1500 1500毫升 一

我有一个DB2V7R3SQLSELECT语句,其中包含三个REGEXP_SUBSTR()实例,所有实例都具有相同的regex模式字符串,每个字符串提取三个组中的一个

我想将第一个子字符串更改为REGEXP_REPLACE(),以便在不匹配的情况下进行条件替换,插入一个与CASE…END的ELSE部分类似的默认值。但我不能让它工作。我可以很容易地使用CASE,但使用RegEx似乎更紧凑、更高效

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

  • 12X125
  • 6X350
  • 1X1500
  • 1500毫升
  • 一千
最后两个在开头没有“nnX”部分,在这种情况下,假定为“1X”,需要插入

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

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

返回的组包括:数量、大小和单位

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

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

这个RexEgg描述了
(?=…)
操作符,它似乎是我需要的,但我不确定。它在我的DB2版本的列表中,但我无法使它工作。坦白地说,它比我的正则表达式知识要深一点,我甚至不能在我最喜欢的在线正则表达式测试仪中工作

那么,有人有什么想法或建议吗。。?谢谢。

试试这个(替换“数字后面不跟X或X数字”):


虽然正则表达式可能更紧凑、更优雅,但如果只使用大小写表达式和内置函数就足够简单的话,它们通常会表现得更好。是的……优雅是我不知道我需要的词。当然也有在一个问题上花费太多时间的事情。我想我会去探索它,因为这样的情况通常会教会我一些东西。此外,我不确定与正则表达式引擎和优化器相比,效率会是多少。我计划在它工作后在几百万行上测试它。我不确定是否/有多少regex活动是像其他SQL块一样被决定性地处理的,这太棒了。非常感谢。你教会了我两件事:1)我需要的答案,它工作得非常完美;2)哇,我不知道语法可以用于CTE(with()),它会非常方便。我现在正在看IBM的在线文档,语法不是很明显。但是在VALUES语句(它指向Queries>Fullselect)下,确实有一段关于它的内容,还有许多其他非常有趣的内容。谢谢@spinjector以防万一。还支持以下方便的语法(不带CTE)(至少在7.3中是这样):
select*from table(values(v11,…,v1N),…,(vM1,…,vMN))t(col1,…,colN)
with t(s) as (values
  '12X125'
, '6X350'
, '1X1500'
, '1500'
, '1125'
)
select regexp_replace(s, '^([\d]+(?![X\d]))', '1X\1')
from t;