我在Oracle db('abc','xyz')的列中有以下值
我想通过删除'和()来分别像abc,xyz一样提取值。有没有办法使用INSTR和SUBSTR函数?
由于
答案 0 :(得分:1)
使用此查询:
with sample as (select '(''abc'', ''xyz'')' text from dual)
select substr(text,instr(text,'''',1,1) + 1,instr(text,'''',1,2) - instr(text,'''',1,1) - 1),
substr(text,instr(text,'''',1,3) + 1,instr(text,'''',1,4) - instr(text,'''',1,3) - 1)
from sample;
答案 1 :(得分:1)
解析后,了解您要对数据执行的操作会有所帮助。如何在SQL与PL / SQL中处理以实现您的要求可能会有很大不同。
也就是说,这是使用强大的regexp_replace(source_string,pattern_string,replace_string)在选择期间同时删除周围的parens并删除单引号的一种方法:
WITH qry AS (SELECT '(' || '''abc''' || ',' || '''xyz''' || ')' orig_string
FROM dual
)
SELECT regexp_replace(orig_string, '[()'']', '' ) clean_string
FROM qry;
regexp_replace pattern_string表示匹配一个字符类(通过打开和关闭方括号来定义),其中包含一个左边的paren或一个右边的paren或一个单引号(引用以便Oracle看到它),而replace_string将其替换为空。
然后,为了解析这里留下的值,我从一些技巧中得到了一个例子,并为此案例进行了调整:
set serveroutput on
DECLARE
-- Build a string in the format "('abc','xyz')"
orig_string varchar2(20) := '(' || '''abc''' || ',' || '''xyz''' || ')';
CURSOR cur IS
WITH qry AS (SELECT regexp_replace(orig_string, '[()'']','' ) clean_string
FROM dual
)
SELECT regexp_substr(clean_string, '[^,]+', 1, ROWNUM) element
FROM qry
CONNECT BY LEVEL <= LENGTH(regexp_replace (clean_string, '[^,]+')) + 1;
BEGIN
FOR rec IN cur LOOP
dbms_output.put_line('Element:' || rec.element);
END LOOP;
END;
它基本上遍历元素并打印它们。我相信你可以根据自己的情况调整它。