2017-06-16 47 views
1

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

  • 原始字符串:011113584378(+) CARD, STAFF
  • 期望的字符串:STAFF CARD
+3

什么是从输入到输出的逻辑?格式将始终为 SPACE <字母顺序> COMMA SPACE <字母顺序>?字母序列总是非空的?他们只是字母,还是可以包含DASH( - )或UNDERSCORE(_)或数字?在我们考虑任何类型的代码之前,请先澄清一下逻辑。 – mathguy

回答

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下划线之间的值。

SOLUTION:

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; 
+4

为什么需要编写一个PL/SQL函数来使用SUBSTR和INSTR? – mathguy

0

好吧,我会咬。这个例子使用REGEXP_REPLACE来描述字符串,保存你需要的部分,以便在返回之前重新排列它们。如果你展示了一些你正在处理的数据的真实世界的例子,那将会更好,因为我只能保证这个例子可以与你提供的那一行一起工作。

正则表达式匹配从字符串开头开始并以结束空间结束的任何字符。下一组任何字符直到但不包括逗号空间都是通过将它们包含在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> 
相关问题