1

我想在 Oracle 中提取以下字符串。我怎样才能做到这一点?

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

2 回答 2

0

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

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

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

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

SQL>
于 2017-06-20T19:52:57.700 回答
0

我想你有编写 PL/SQL 函数的奢侈吗?然后只需使用"SUBSTR"和/或"INSTR"|| 连接运算符来解析您的输入。

这是一个例子:

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;
于 2017-06-16T22:05:19.467 回答