Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从Oracle中的字符串中提取特定的数据集_Sql_String_Oracle_Regexp Replace_Regexp Substr - Fatal编程技术网

Sql 从Oracle中的字符串中提取特定的数据集

Sql 从Oracle中的字符串中提取特定的数据集,sql,string,oracle,regexp-replace,regexp-substr,Sql,String,Oracle,Regexp Replace,Regexp Substr,我有字符串“1_A_B_C_D_E_1_2_3_4_5”,我正在尝试提取数据“A_B_C_D_E”。我正在尝试从字符串中删除\u 1\u 2\u 3\u 4\u 5部分和1\u部分。它本质上是字符串中的数字部分。最后一个字母表之后的任何特殊字符也必须删除。在本例中,字符E后的\uU也不得出现 我正在尝试的查询如下所示 SELECT REGEXP_SUBSTR('1_A_B_C_D_E_1_2_3_4_5','[^0-9]+',1,1) from dual 我从上述查询中获得的数据如下:-

我有字符串“1_A_B_C_D_E_1_2_3_4_5”,我正在尝试提取数据“A_B_C_D_E”。我正在尝试从字符串中删除\u 1\u 2\u 3\u 4\u 5部分和1\u部分。它本质上是字符串中的数字部分。最后一个字母表之后的任何特殊字符也必须删除。在本例中,字符E后的\uU也不得出现

我正在尝试的查询如下所示

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_
我正试图找到一种方法来删除结尾处的下划线。还有其他方法吗?

假设“字母”先出现,然后是“数字”,您可以这样做:

select regexp_substr('A_B_C_D_E_1_2_3_4_5','.*[A-Z]') from dual;
这将从字符串的开头提取所有字符,直到字符串中的最后一个大写字母(
*
是贪婪的,它将尽可能地扩展,同时仍然允许多个大写字母来完成匹配)

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

使用REGEXP\u替换:

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
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
工作原理:

  • REGEXP\u REPLACE
    将替换字符串中出现的所有数值'[0-9]+'。或者,您也可以使用POSIX字符类'[^[:digit:][]+'
  • 修剪两个'.'
    将从字符串中删除任何超前和滞后的
    .
  • 同时使用REGEXP\u SUBSTR

    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
    
    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
    

    请更具体地说明您必须保留的内容以及必须从字符串中删除的内容。是你必须始终保持在一开始,还是在中间?图案字母下划线字母下划线(etc)和数字是否相同,并且必须保留字母部分?还是怎样别让我们猜!那么,“字母”总是第一位,而“数字”总是最后一位吗?您必须用一些示例字符串来澄清您的问题,这些示例字符串具有数据中可用的不同字符串组合以及每个字符串的预期输出。回答时很难假设情况。
    从dual中选择regexp_substr('1_A_B_C_D_E_1_2_3_4_5','.[A-Z]')返回不好的
    1_A_B_C_D_E
    。我对你的答案投了赞成票,因为它在问题中使用的字符串上效果很好。@cdaiga-请参阅原始问题下我的评论。我要求OP澄清,他修改了问题,但仍然不清楚。在我上面的回答中,阅读第一句话——我明确地陈述了我的假设。