2016-11-21 2 views
1

Я пытаюсь получить данные, представленные в одном столбце, который разделен двойным хешем (##). Согласно моему запросу, упомянутому ниже, я могу получить только 5 записей вместо 6 строк.SQL Query Возвращает только 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

Можете ли вы опубликовать достаточно информации для повторения проблемы - например, создать таблицу SQL для таблицы TEMP и 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.

+0

Я ищу что-то вроде этого: Line1 Line2 Line3 Line4 Line5 Line6 – JustCoder

+0

Не могли бы вы использовать последний запрос, поскольку я обновил код для легкой репликации.! – JustCoder

+0

Вы ищете строки1, line2 и т. Д. В разных строках? если да, то как мой ответ не дает вам то, что вам нужно? – Boneist

Смежные вопросы