在 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 似乎更紧凑和高效。
例如,我有食品容器尺寸的描述,处于各种完整性状态:
- 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 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;
我有一个 DB2 v7r3 SQL SELECT 语句,其中包含三个 REGEXP_SUBSTR() 实例,所有实例都具有相同的正则表达式模式字符串,每个都提取三个组中的一个。
我想将第一个 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 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;