【问题标题】:Extract Specific Set of data from a String in Oracle从Oracle中的字符串中提取特定的数据集
【发布时间】:2018-08-07 20:35:19
【问题描述】:

我有字符串“1_A_B_C_D_E_1_2_3_4_5”,我正在尝试提取数据“A_B_C_D_E”。我正在尝试从字符串中删除 _1_2_3_4_51_ 部分。这本质上是字符串中的数字部分。最后一个字母之后的任何特殊字符也必须删除。在此示例中,字符 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_

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

【问题讨论】:

  • 请更具体地说明您必须保留的内容以及必须从字符串中删除的内容。您必须始终保留的部分是在开头,还是也可以在中间?模式字母下划线字母下划线(等)然后与数字相同,您必须只保留字母部分吗?要不然是啥?不要让我们猜测!
  • 那么,“字母”总是在前,“数字”总是在后吗?
  • 您必须使用一些示例字符串来澄清您的问题,这些示例字符串具有您数据中可用的不同字符串组合以及每个字符串的预期输出。回答时很难假设事情。

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


【解决方案1】:

假设“字母”在前,然后是“数字”,你可以这样做:

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

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

【讨论】:

  • select regexp_substr('1_A_B_C_D_E_1_2_3_4_5','.*[A-Z]') from dual; 返回1_A_B_C_D_E 这不好。我投票赞成你的答案,因为它完美地适用于问题中使用的字符串。
  • @cdaiga - 在原始问题下查看我的 cmets。我要求OP进行澄清,他修改了问题,但仍然不清楚。在我上面的回答中,请阅读第一句话——我明确地陈述了我的假设。
【解决方案2】:

我有字符串'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 '_' 将从字符串中删除所有前导和滞后的 _

也使用 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

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多