我想在 Oracle 中提取以下字符串。我怎样才能做到这一点?
- 原始字符串:
011113584378(+) CARD, STAFF
- 预期字符串:
STAFF CARD
我想在 Oracle 中提取以下字符串。我怎样才能做到这一点?
011113584378(+) CARD, STAFF
STAFF CARD
好的,我会咬的。此示例使用 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>
我想你有编写 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;