从Oracle中的String中提取特定数据集

时间:2018-02-28 03:28:49

标签: sql string oracle regexp-replace regexp-substr

我有字符串' 1_A_B_C_D_E_1_2_3_4_5 ',我正在尝试提取数据' A_B_C_D_E '。我想删除 _1_2_3_4_5 &字符串中的 1 _ 部分。这本质上是字符串中的数字部分。还必须删除最后一个字母后的任何特殊字符。在此示例中,字符 E 之后的 _ 也必须不存在。

我正在尝试的查询如下

SELECT 
REGEXP_SUBSTR('1_A_B_C_D_E_1_2_3_4_5','[^0-9]+',1,1) 
from dual

我从上述查询中获得的数据如下: -

_A_B_C_D_E_

我正试图找到一种方法来删除最后的下划线。还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

假设"字母"先来,然后是"数字",你可以这样做:

select regexp_substr('A_B_C_D_E_1_2_3_4_5','.*[A-Z]') from dual;

这将从字符串的开头拉出所有字符,直到字符串中的最后一个大写字母(.*是贪婪的,它将尽可能地延伸,同时仍然允许另一个上层-case来完成比赛。)

答案 1 :(得分:1)

  

我有字符串' 1_A_B_C_D_E_1_2_3_4_5'我正在尝试提取数据' A_B_C_D_E'

使用 REGEXP_REPLACE

SQL> SELECT trim(BOTH '_' FROM
  2         (REGEXP_SUBSTR('1_A_B_C_D_E_1_2_3_4_5','[0-9]+', ''))) str
  3  FROM dual;

STR
---------
A_B_C_D_E

工作原理:

  1. REGEXP_REPLACE将从字符串中替换所有数字出现' [0-9] +' 。或者,您也可以使用POSIX字符类' [^ [:digit:]] +'
  2. TRIM BOTH '_'会从字符串中移除任何前导和滞后_
  3. 还使用 REGEXP_SUBSTR

    SELECT trim(BOTH '_' FROM 
           (REGEXP_SUBSTR('1_A_B_C_D_E_1_2_3_4_5','[^0-9]+'))) str 
    FROM dual;
    STR
    ---------
    A_B_C_D_E