Oracle SQL получает n-й элемент регулярного выражения - PullRequest
6 голосов
/ 09 сентября 2011

Я пытаюсь получить n-й элемент в строке через запятую, используя SQL в Oracle.

Пока у меня есть следующее ..

SELECT regexp_substr(
   '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N',
   '[^,]+',
   1,
   7)
FROM dual;

, но это не работаеткогда элемент пуст, т.е., кто-нибудь может помочь?

Ответы [ 4 ]

4 голосов
/ 09 сентября 2011

Если ваши значения с разделителями всегда заключены между запятыми в буквенно-цифровом формате, вы можете попробовать:

SELECT REGEXP_SUBSTR( <delimied_string>, '[[:alnum:]]{0,},', 1, 7 )
  FROM dual;

Чтобы получить седьмое значение (включая запятую).Если оно пустое, вы просто получаете конечную запятую (которую вы можете легко удалить).

Очевидно, что если вы хотите получить значение, отличное от седьмого, то замените значение четвертого параметра на любое другое вхождение, например * 1006.*

SELECT REGEXP_SUBSTR( <delimied_string>, '[[:alnum:]]{0,},', 1, <nth occurance> )
  FROM dual;

РЕДАКТИРОВАТЬ: Поскольку я люблю REGEX, вот решение, которое также удаляет запятую

SELECT REPLACE(
          REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, <nth>), 
          ','
       )
  FROM dual;

надеюсь, что это поможет

1 голос
/ 09 сентября 2011

Если вы не застряли в регулярных выражениях, это также работает:

WITH q AS (
SELECT '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' thestring FROM dual
)
SELECT SUBSTR(thestring, INSTR(thestring,',',1,6)+1, 
                         INSTR(thestring,',',1,7)-INSTR(thestring,',',1,6)-1) "The Element"
  FROM q;

The Element
------------------------
100000010892100000012655

Другая возможность. Вы не указали, каков источник ваших данных. Не могли бы вы использовать внешнюю таблицу для чтения вашего входного источника и обработки его с помощью SQL?

1 голос
/ 09 сентября 2011

Вы можете сделать это с помощью небольшой хитрости: сначала замените все запятые на запятую, а затем на пробел, а затем пропустите этот дополнительный пробел:

SQL> with data as
  2  ( select '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' txt
  3      from dual
  4  )
  5  select regexp_substr(txt,'[^,]+',1,7)                             seventh_element_wrong
  6       , replace(txt,',',', ')                                      with_extra_space_after_comma
  7       , regexp_substr(replace(txt,',',', '),'[^,]+',1,7)           seventh_element_leading_space
  8       , substr(regexp_substr(replace(txt,',',', '),'[^,]+',1,7),2) the_seventh_element
  9    from data
 10  /

S WITH_EXTRA_SPACE_AFTER_COMMA
- ----------------------------------------------------------------------------------------------------------------------
SEVENTH_ELEMENT_LEADING_S THE_SEVENTH_ELEMENT
------------------------- ------------------------
1 100016154, 5101884LT00001, , , , , 100000010892100000012655, L, SEI, 5101884LT00001, 1, SL, 3595.03, 00, 2, N, N, G, N
 100000010892100000012655 100000010892100000012655

С уважением,
Роб.

0 голосов
/ 22 октября 2013
SELECT rtrim(regexp_substr('100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N','[^,]{0,}[,]?',1,7),',')
FROM dual;
...