【问题标题】:Substring using Oracle When there is multiple Matches?使用Oracle的子字符串时有多个Matches?
【发布时间】:2021-08-23 13:28:50
【问题描述】:

您好,我正在尝试在 oracle 中获取以下两个字符串的子字符串。如果模式匹配以 S9C 开头并且在 S9C 之后有 8 个数字,我想要结果

例如:对于以下两个输入,我需要像这样的输出

输入:

 1.CABLE : THERMINAL 3X2X0.25MM FPCP PLUS UNITRONIC S9C000019651  
 2.Motor Protection Relay EMR-3MPO-2S9CB1-1 (was IQ1000II / MP 3000)
 3.GREASE : BEM 41-132 3KG CARTRIDGE KLUBERPLEX S9C00019171 (Order by KG's required)
 4.DO NOT USE CARRIER SPIDEX ZK 38 98 SH. S9C00011593 (SUPERSEDE BY S9C10204555 - WIN0020775)

输出:

1.Null
2.Null
3.S9C00019171
4.S9C10204555

【问题讨论】:

  • "从 S9C 开始,在 A9B 之后有 8 个数字" - 对不起,但是 - 您发布的示例数据中根本没有 A9B,所以 all 输出应该为 NULL .
  • @Littlefoot 感谢您的更正。

标签: oracle


【解决方案1】:

您可以结合使用REGEXP_SUBSTRREGEXP_COUNT 来解决您的问题:

WITH test_data(input) AS
(
  SELECT  '1.CABLE : THERMINAL 3X2X0.25MM FPCP PLUS UNITRONIC S9C000019651' FROM DUAL UNION ALL 
  SELECT  '2.Motor Protection Relay EMR-3MPO-2S9CB1-1 (was IQ1000II / MP 3000)' FROM DUAL UNION ALL
  SELECT  '3.GREASE : BEM 41-132 3KG CARTRIDGE KLUBERPLEX S9C00019171 (Order by KG''s required)' FROM DUAL UNION ALL
  SELECT  '4.DO NOT USE CARRIER SPIDEX ZK 38 98 SH. S9C00011593 (SUPERSEDE BY S9C10204555 - WIN0020775)' FROM DUAL
)
SELECT regexp_substr(td.input, 
                     'S9C[0-9]{8}( |$)', 
                     1, 
                     GREATEST(1, regexp_count(td.input, 'S9C[0-9]{8}( |$)')))
FROM test_data td

以下是其工作原理的简要说明:

  1. REGEXP_COUNT 统计目标模式的出现次数,因此我们可以稍后获取最后一次出现的次数。
  2. 将结果包装在GREATEST 中,因为0 对REGEXP_SUBSTR 参数无效。
  3. 调用REGEXP_SUBSTR 获取目标字符串的最后一次出现。

这是一个 DBFiddle 向您展示它的工作原理 (DBFiddle)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2018-05-02
    • 2012-08-10
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多