【问题标题】:Oracle PL/SQL Tokenize String with empty position具有空位置的 Oracle PL/SQL 标记字符串
【发布时间】:2014-12-01 18:50:29
【问题描述】:

我有一个这样的字符串:

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', '[^,]+'));

输出是这样的:

VALUE LEVEL
AAA   1
BBB   2
DDD   3

【问题讨论】:

  • 以上代码的输出是什么
  • 我已经更新了问题。

标签: oracle plsql


【解决方案1】:

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

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

这也适用http://sqlfiddle.com/#!4/b255d/26

【讨论】:

  • 这样你丢失了最后一个字符串 DDD
  • 这是因为逗号的长度,因此我进行了编辑
【解决方案2】:
SELECT token, lvl FROM (
  SELECT    regexp_substr ('AAA,BBB,,DDD', '[^,]*', 1, LEVEL) token, LEVEL lvl,
            lag(regexp_substr ('AAA,BBB,,DDD', '[^,]*', 1, LEVEL)) over(order by level) prev_token
  FROM    dual
  CONNECT BY LEVEL <= LENGTH(regexp_replace ('AAA,BBB,,DDD', '[^,]+'))*2
) WHERE prev_token is null;

【讨论】:

  • 非常感谢您的回答!
  • 这不会给出正确的标记位置。
  • 对 @LalitKumarB ,我已经看到令牌是正确的,但水平不正确。我得到 1、3、5、6 而不是 1、2、3、4(或 0、1、2、3)
【解决方案3】:

在 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;

SQL Fiddle

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2013-03-24
    • 2014-10-19
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2012-06-12
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多