我想在Oracle中提取以下字符串。我怎么能这样做?
011113584378(+) CARD, STAFF
STAFF CARD
答案 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>