在oracle pl sql中从csv格式中选择单个值

时间:2014-03-14 15:15:18

标签: sql oracle

我在Oracle db('abc','xyz')的列中有以下值

我想通过删除'和()来分别像abc,xyz一样提取值。有没有办法使用INSTR和SUBSTR函数?

由于

2 个答案:

答案 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;

它基本上遍历元素并打印它们。我相信你可以根据自己的情况调整它。