2016-11-21 140 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