Podziel ciąg znaków według pozycji ogranicznika za pomocą oracle SQL

Mam ciąg znaków i chciałbym podzielić go za pomocą ogranicznika w określonej pozycji.

Na przykład, mój ciąg znaków to F/P/O, a wynik którego szukam to:

Zrzut ekranu pożądanego rezultatu

Dlatego chciałbym oddzielić ciąg znaków przez najdalszy ogranicznik.
Uwaga: Niektóre z moich ciągów są F/O również dla których mój SQL poniżej działa dobrze i zwraca pożądany wynik.

SQL, który napisałem jest następujący:

SELECT Substr('F/P/O', 1, Instr('F/P/O', '/') - 1) part1, 
       Substr('F/P/O', Instr('F/P/O', '/') + 1)    part2 
FROM   dual

I wynik jest:

Zrzut ekranu nieoczekiwanego wyniku

Dlaczego tak się dzieje i jak Mogę to naprawić?
Author: Kyll, 2014-11-12

2 answers

Chcesz użyć regexp_substr() do tego. To powinno zadziałać na twój przykład:

select regexp_substr(val, '[^/]+/[^/]+', 1, 1) as part1,
       regexp_substr(val, '[^/]+$', 1, 1) as part2
from (select 'F/P/O' as val from dual) t

Tutaj , nawiasem mówiąc, jest Skrzypek SQL.

UPS. Przegapiłem część pytania, Gdzie jest napisane ostatni ogranicznik. W tym celu możemy użyć regex_replace() dla pierwszej części:
select regexp_replace(val, '/[^/]+$', '', 1, 1) as part1,
       regexp_substr(val, '[^/]+$', 1, 1) as part2
from (select 'F/P/O' as val from dual) t

I tutaj jest odpowiednikiem SQL Fiddle.

 31
Author: Gordon Linoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-12 02:50:13

Dlatego chciałbym oddzielić ciąg znaków przez najdalszy ogranicznik.

Wiem, że to stare pytanie, ale jest to prosty wymóg, dla którego SUBSTR i INSTR wystarczyłyby. REGEXPsą nadal wolniejszymi operacjamii intensywniejszymi operacjami niż stare funkcje subtsr i instr.

SQL> WITH DATA AS
  2    ( SELECT 'F/P/O' str FROM dual
  3    )
  4  SELECT SUBSTR(str, 1, Instr(str, '/', -1, 1) -1) part1,
  5         SUBSTR(str, Instr(str, '/', -1, 1) +1) part2
  6  FROM DATA
  7  /

PART1 PART2
----- -----
F/P   O

Jak powiedziałeś chcesznajdalszy ogranicznik, oznaczałby pierwszy ogranicznik z rewers .

Podejście było w porządku, ale brakowało start_positionw INSTR. Jeśli pozycja start_position jest ujemna, to funkcja INSTR zlicza z powrotem liczbę znaków start_position od końca łańcucha, a następnie wyszukuje w kierunku początku łańcucha.

 41
Author: Lalit Kumar B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-06 05:30:08