Как получить n-ю строку из строк с разделителями, используя REGEXP_SUBSTR в Oracle - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть строка, ограниченная #, и я хочу третий набор / ячейку в строке.

Например:

select REGEXP_SUBSTR( 'abc#def##########xyz','[^#]+', 1,1,null) from dual;

Выходы: abc

select REGEXP_SUBSTR( 'abc#def##########xyz','[^#]+', 1,2,null) from dual;

Выходы: def

Однако

select REGEXP_SUBSTR( 'abc#def##########xyz','[^#]+', 1,3,null) from dual;

Выходы: xyz

Но я ожидаю получить null, поскольку третья ячейка между ## пуста.

Ответы [ 2 ]

3 голосов
/ 10 апреля 2019

Это знакомая проблема . Используйте другой шаблон, поскольку этот ответ предполагает:

select REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, 1, null, 1) from dual;

abc

select REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, 2, null, 1) from dual;

def

select REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, 3, null, 1) from dual;

(null)

select REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, 12, null, 1) from dual;

xyz

Или получить их все одновременно с помощью иерархического запроса (или рекурсивного CTE):

select level as pos,
  REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, level, null, 1) as result
from dual
connect by level <= regexp_count('abc#def##########xyz', '#') + 1;

       POS RESULT              
---------- --------------------
         1 abc                 
         2 def                 
         3 (null)              
         4 (null)              
         5 (null)              
         6 (null)              
         7 (null)              
         8 (null)              
         9 (null)              
        10 (null)              
        11 (null)              
        12 xyz                 

12 rows selected. 
0 голосов
/ 10 апреля 2019

Как насчет SUBSTR + INSTR комбинации?

SQL> with test (col) as (select 'abc#def##########xyz' from dual)
  2  select substr(col, instr(col, '#', 1, 2) + 1,
  3                     instr(col, '#', 1, 3) - instr(col, '#', 1, 2) - 1
  4               ) third_string,
  5         --
  6         substr(col, instr(col, '#', 1, 1) + 1,
  7                     instr(col, '#', 1, 2) - instr(col, '#', 1, 1) - 1
  8               ) second_string
  9  from test;

THIRD_STRING    SECOND_STRING
--------------- ---------------
                def

SQL>

Объяснение second_string (более простой случай, поскольку на самом деле возвращается что-то ):

  • первая строка INSTR находит второе появление символа #
  • вторая строка INSTR находит 3-е появление символа # и вычитает 2-е появление (таким образом, создается длина подстроки)
...