正则表达式 - 在SQL中获取特定的组值

时间:2015-04-01 03:07:20

标签: sql regex oracle

我有以下正则表达式问题。

输入:

123_321_009
3111_00_001
5123_123
555
666_A66
777_B77_777

输出请求如下:

123_321
3111_00
5123
555
666_A66
777_B77

有没有办法获得上面输出的值?

我尝试了下面的陈述,但缺乏如何获得我需要的价值的想法。

^(.*?)\\s?([_0-9])?$

不需要在最后一个下划线后出现的值。

2 个答案:

答案 0 :(得分:2)

您可以使用REGEXP_REPLACE删除/包括最后一个下划线的数字。

SQL Fiddle

<强>查询

with x(y) as (
  select '123_321_009' from dual union all
  select '3111_00_001' from dual union all
  select '5123_123' from dual union all
  select '666_A66' from dual union all
  select '777_B77_777' from dual union all
  select '555' from dual
)
select y, regexp_replace(y,'_\d+$') substr
from x

<强> Results

|           Y |  SUBSTR |
|-------------|---------|
| 123_321_009 | 123_321 |
| 3111_00_001 | 3111_00 |
|    5123_123 |    5123 |
|     666_A66 | 666_A66 |
| 777_B77_777 | 777_B77 |
|         555 |     555 |

模式:

_       --matches an underscore
\d+     --matches one or more numbers
$       --matches end of the string

实际上,这会匹配/包括最后一个下划线的所有数字。第三个参数是regexp_replace被省略。所以,模式是 删除并替换为空。

答案 1 :(得分:1)

由于您使用的是Oracle,因此可以使用具有此模式的regex_replace(val,pattern,'')函数。

以下模式将满足您提供的样本:

_[0-9]{3}$

_[0-9]*$

以下是使用SQL * Plus的这种方法的演示:

 SCOTT@dev> WITH tab(num_val) AS
      2    ( SELECT '123_321_009' FROM dual
      3    UNION ALL
      4    SELECT '3111_00_001' FROM dual
      5    UNION ALL
      6    SELECT '5123_123' FROM dual
      7    UNION ALL
      8    SELECT '555' FROM dual
      9    )
     10  SELECT tab.num_val,
     11    regexp_replace(tab.num_val,'_[0-9]{3}$') approach_1,
     12    regexp_replace(tab.num_val,'_[0-9]*$') approach_2
     13  FROM tab
     14  /

    NUM_VAL     APPROACH_1             APPROACH_2
    =========== ====================== ==================
    123_321_009 123_321                123_321
    3111_00_001 3111_00                3111_00
    5123_123    5123                   5123
    555         555                    555

如果您提供了更大的抽样(或更具体的规则),则可以提供更具体的解决方案。