2016-11-21 110 views
1

我想获取单列中存在的数据,该列使用双散列(##)分隔。根据我下面提到的查询,我能够只取5条记录而不是6条记录。SQL查询返回只有5条记录,而不是6行

我可以认为我的connectby表达式存在一些问题。任何帮助是极大的赞赏。

数据

Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ## 

查询用来获取被分隔双哈希##在一条记录记录

复制场景:

create table temp (errormessage varchar2(300)) 

insert into temp errormessage values('Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##') 



WITH sample_data 
    AS (SELECT errormessage AS Error_Message 
      FROM TEMP) 
SELECT Regexp_substr(error_message, ',?([^#]*)', 1, LEVEL, 'i', 1) AS Error_Message 
FROM sample_data 
WHERE Length(Regexp_substr(error_message, ',?([^#]*)', 1, LEVEL, 'i', 1)) != 0 
CONNECT BY (Regexp_count(error_message, '#') + 1 >= LEVEL AND 
      PRIOR dbms_random.value IS NOT NULL) 
ORDER BY LEVEL 

错误信息具有要分隔的信息的列。现在,在任何数据库中复制问题都非常容易。

+0

您是否可以发布足够的信息来重现问题 - 例如为表TEMP创建表SQL并使用6条插入语句来设置数据? –

+0

当然,让我试试创建那个 – JustCoder

+0

@TonyAndrews现在你应该能够轻松地复制场景。 – JustCoder

回答

2

也许你喜欢的东西后:

WITH sample_data AS (SELECT 1 stagging_id, 
          'A' status, 
          'Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##' error_message 
        FROM dual UNION ALL 
        SELECT 2 stagging_id, 
          'B' status, 
          'Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##Line7 ##' error_message 
        FROM dual) 
SELECT stagging_id, 
     status, 
     regexp_substr(error_message, '[^#]+', 1, LEVEL) err_msg 
FROM sample_data 
CONNECT BY PRIOR stagging_id = stagging_id 
      AND PRIOR sys_guid() IS NOT NULL 
      AND regexp_substr(error_message, '[^#]+', 1, LEVEL) IS NOT NULL; 

STAGGING_ID STATUS ERR_MSG 
----------- ------ -------------------------------------------------------------- 
      1 A  Line1 
      1 A  Line2 
      1 A  Line3 
      1 A  Line4 
      1 A  Line5 
      1 A  Line6 
      2 B  Line1 
      2 B  Line2 
      2 B  Line3 
      2 B  Line4 
      2 B  Line5 
      2 B  Line6 
      2 B  Line7 

问题与您现有的代码是在REGEXP_SUBSTR的*,加上您计算单#,而你的分隔符是##的事实。

你能解决您的查询,像这样:

WITH sample_data AS (SELECT 1 stagging_id, 
          'A' status, 
          'Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##' error_message 
        FROM dual UNION ALL 
        SELECT 2 stagging_id, 
          'B' status, 
          'Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##Line7 ##' error_message 
        FROM dual) 
SELECT Regexp_substr(error_message, ',?([^#]+)', 1, LEVEL, 'i', 1) AS Error_Message 
FROM sample_dataCONNECT BY (Regexp_count(error_message, '##') >= LEVEL AND 
      PRIOR stagging_id = stagging_id AND 
      PRIOR dbms_random.value IS NOT NULL) 
ORDER BY stagging_id, LEVEL; 

ERROR_MESSAGE 
-------------------------------------------------------------- 
Line1 
Line2 
Line3 
Line4 
Line5 
Line6 
Line1 
Line2 
Line3 
Line4 
Line5 
Line6 
Line7 

注意我是如何在REGEXP_SUBSTR的在regexp_count改变了* s到+ S和'#''##'

+0

我正在寻找类似的事情:Line1 Line2 Line3 Line4 Line5 Line6 – JustCoder

+0

请您尝试使用最新的查询,因为我更新了易于复制的代码。 – JustCoder

+0

您正在寻找不同行上的line1,line2等?如果是这样,我的答案如何不会给你什么后? – Boneist