位置为空的Oracle PL/SQL标记化字符串

位置为空的Oracle PL/SQL标记化字符串,oracle,plsql,Oracle,Plsql,我有一根这样的线: VALUE LEVEL AAA 1 BBB 2 (null) 3 DDD 4 AAA,BBB,DDD 我想使用逗号标记它,并检索如下表: VALUE LEVEL AAA 1 BBB 2 (null) 3 DDD 4 我需要知道字符串,并在开关位置找到它,而不丢失空字符串 我尝试过这样的代码,但我错过了空位置: SELECT regexp_substr ('AAA,BBB,,DDD', '[^,]+', 1, level),

我有一根这样的线:

VALUE  LEVEL 
AAA    1
BBB    2
(null) 3
DDD    4
AAA,BBB,DDD

我想使用逗号标记它,并检索如下表:

VALUE  LEVEL 
AAA    1
BBB    2
(null) 3
DDD    4
我需要知道字符串,并在开关位置找到它,而不丢失空字符串

我尝试过这样的代码,但我错过了空位置:

SELECT    regexp_substr ('AAA,BBB,,DDD', '[^,]+', 1, level), level
FROM    dual
CONNECT BY LEVEL <= LENGTH(regexp_replace ('AAA,BBB,,DDD', '[^,]+'));

在oracle 11g和更高版本中,您可以执行以下查询:

with      
  tab1(pointer,test,split_test) as
  (select
    1 as pointer,test,substr(test,0,case when instr(test,',',1,1) = 0 then LENGTH(test)
                        else instr(test,',',1,1)-1 end) split_test from table1
  union all
  select
  pointer + 1 as pointer,test,
  substr(test,instr(test,',',1,pointer) + 1,case when instr(test,',',1,pointer + 1) = 0 then LENGTH(test) else
   instr(test,',',1,pointer + 1) - instr(test,',',1,pointer) - 1 end) split_test
  from tab1 where pointer - 1 < LENGTH(test)-LENGTH(REPLACE(test,',','')))
select split_test as "value",pointer as "level" from tab1;

另一个简单的答案是用逗号替换逗号,如下所示

SELECT    trim(regexp_substr (replace('AAA,BBB,,DDD',',',', '), '[^,]+', 1, level)), level
FROM    dual
CONNECT BY LEVEL <= REGEXP_COUNT (replace('AAA,BBB,,DDD',',',', '), '[^,]+');

这同样有效

以上代码的输出是什么?我已经更新了这个问题。非常感谢您的回答!这不会给出标记的正确位置。对@LalitKumarB,我已经看到标记是正确的,但不是正确的lvel。我得到的是1,3,5,6,而不是1,2,3,4或0,1,2,3,这样你就丢失了最后一个字符串ddt,这是因为逗号的长度,因此我进行了编辑
SELECT    trim(regexp_substr (replace('AAA,BBB,,DDD',',',', '), '[^,]+', 1, level)), level
FROM    dual
CONNECT BY LEVEL <= REGEXP_COUNT (replace('AAA,BBB,,DDD',',',', '), '[^,]+');