如何在Oracle中提取字符串

时间:2017-06-16 21:56:01

标签: oracle regexp-substr

我想在Oracle中提取以下字符串。我怎么能这样做?

  • 原始字符串:011113584378(+) CARD, STAFF
  • 预期字符串:STAFF CARD

2 个答案:

答案 0 :(得分:0)

我认为您可以编写PL / SQL函数吗?然后,只需使用"SUBSTR"和/或"INSTR"以及|| concatenation operator来解析您的输入。

以下是一个例子:

https://www.techonthenet.com/oracle/questions/parse.php

...该字段可能包含以下值:

F:\Siebfile\YD\S_SR_ATT_1-60SS_1-AM3L.SAF

在这种情况下,我需要返回'1-60SS'的值,因为这是第3和第4下划线之间的值。

解决方案:

create or replace function parse_value (pValue varchar2)
   return varchar2
is
   v_pos3 number;
   v_pos4 number;

begin

   /* Return 3rd occurrence of '_' */
   v_pos3 := INSTR (pValue, '_', 1, 3) + 1;

   /* Return 4rd occurrence of '_' */
   v_pos4 := INSTR (pValue, '_', 1, 4);

   return SUBSTR (pValue, v_pos3, v_pos4 - v_pos3);

end parse_value;

答案 1 :(得分:0)

好的,我会咬人。此示例使用REGEXP_REPLACE来描述字符串,保存所需的部分,以便在返回之前重新排列它们。如果您展示一些您正在处理的数据的真实示例会更好,因为我只能保证此示例将与您提供的一行一起使用。

正则表达式匹配从字符串开头开始并以close paren-space结尾的任何字符。下一组任何符号,但不包括逗号空间的字符是"记住"将它们封闭在parens中。这称为捕获组。下一个捕获的组是该逗号空间分隔符之后的字符集,直到该行的末尾(美元符号)。捕获的组按从左到右的顺序引用。第三个参数是要返回的字符串,它是第二个和第一个捕获的组,按顺序,用空格分隔。

SQL> with tbl(str) as (
     select '+011113584378(+) CARD, STAFF' from dual
   )
   select regexp_replace(str, '^.*\) (.*), (.*)$', '\2 \1') formatted
   from tbl;

FORMATTED
----------
STAFF CARD

SQL>