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:
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:
Dlaczego tak się dzieje i jak Mogę to naprawić?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.
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.
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