Oracle REGEXP_SUBSTR, возвращая NULL в качестве значения - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь разбить данные из столбца на строки, но я столкнулся с этой проблемой здесь. Когда я запускаю этот запрос, он хорошо разбивает данные, но также возвращает NULL как дополнительную строку.

Вот значение, которое я пытаюсь разделить ,162662163,90133140,163268955,169223426,169222899,

WITH CTE AS(
SELECT 

RTRIM(LTRIM(PG2.MULTILIST11, ','), ',') ACCESS_BY_GROUPS

FROM AGILE.ITEM I 
INNER JOIN AGILE.PAGE_TWO PG2 ON PG2.ID = I.ID
WHERE             

 ITEM_NUMBER IN --('313-000074', 
('313-000090')

)
SELECT DISTINCT

REGEXP_SUBSTR(ACCESS_BY_GROUPS, '[^,]+', 1, column_value) ACCESS_BY_GROUPS

FROM CTE 

CROSS JOIN TABLE(CAST(MULTISET(SELECT LEVEL FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT(CTE.ACCESS_BY_GROUPS, ',') + 10

) AS sys.odcinumberlist))

I не хочу получить это нулевое значение. Я не могу применить эту проверку из запроса, потому что это повлияет и на другие значения столбца, поэтому я хочу, чтобы он обрабатывался где-то в функции. Я надеюсь, что кто-то может помочь.

1 Ответ

2 голосов
/ 20 марта 2020

Это из-за начальных и конечных запятых.

Один из вариантов - начать с позиции 2 (см. Строку № 3) и ограничить количество значений (строка № 5)

SQL> with test (col) as
  2    (select ',162662163,90133140,163268955,169223426,169222899,' from dual)
  3  select regexp_substr(col, '[^,]+', 2, level) res
  4  from test
  5  connect by level <= regexp_count(col, ',') - 1
  6  /

RES
-------------------------------------------------
162662163
90133140
163268955
169223426
169222899

SQL>
* 1005. * Другой способ - сначала удалить начальную и конечную запятую, а затем разделить остальные на строки:
SQL> with test (col) as
  2    (select ',162662163,90133140,163268955,169223426,169222899,' from dual),
  3  temp as
  4    -- remove leading and trailing comma first
  5    (select ltrim(rtrim(col, ','), ',') col
  6     from test
  7    )
  8  select regexp_substr(col, '[^,]+', 1, level) res
  9  from temp
 10  connect by level <= regexp_count(col, ',') + 1;

RES
------------------------------------------------
162662163
90133140
163268955
169223426
169222899

SQL>

[EDIT - для более чем одной строки]

Если задействовано больше строк, код необходимо изменить. Обратите внимание, что для каждой строки должен быть какой-то уникальный идентификатор (идентификатор в моем примере).

SQL> with test (id, col) as
  2    (select 1, ',162662163,90133140,163268955,169223426,169222899,' from dual union all
  3     select 2, ',1452761,1452762,' from dual
  4    )
  5  select id,
  6         regexp_substr(col, '[^,]+', 2, column_value) res
  7  from test cross join table(cast(multiset(select level from dual
  8                                           connect by level <= regexp_count(col, ',') - 1
  9                                          ) as sys.odcinumberlist))
 10  order by id, column_value
 11  /

        ID RES
---------- -------------------------------------------------
         1 162662163
         1 90133140
         1 163268955
         1 169223426
         1 169222899
         2 1452761
         2 1452762

7 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...