Разделить строку по разделительной позиции с помощью oracle SQL
У меня есть строка, и я хотел бы разбить эту строку на разделитель в определенной позиции.
Например, моя строка F/P/O
, и результат, который я ищу, это:
![Screenshot of desired result]()
Поэтому я хотел бы разделить строку на самый дальний разделитель.
Примечание. Некоторые из моих строк - это F/O
, для которых мой SQL ниже работает отлично и возвращает желаемый результат.
SQL, который я написал, выглядит следующим образом:
SELECT Substr('F/P/O', 1, Instr('F/P/O', '/') - 1) part1,
Substr('F/P/O', Instr('F/P/O', '/') + 1) part2
FROM dual
и результат:
![Screenshot of unexpected result]()
Почему это происходит и как я могу это исправить?
Ответы
Ответ 1
Вы хотите использовать regexp_substr()
для этого. Это должно работать для вашего примера:
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
Здесь, кстати, является SQL Fiddle.
К сожалению. Я пропустил часть вопроса, где говорится о последнем разделителе. Для этого мы можем использовать regex_replace()
для первой части:
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
И здесь - это соответствующий SQL-скрипт.
Ответ 2
Поэтому я хотел бы отделить строку самым дальним разделителем.
Я знаю, что это старый вопрос, но это простое требование, для которого достаточно SUBSTR и INSTR. REGEXP работают медленнее и интенсивно работающие CPU, чем старые функции subtsr и 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
Как вы сказали, вам нужен самый дальний разделитель, это будет означать первый разделитель из reverse.
Вы подошли отлично, но вам не хватало start_position в INSTR. Если начальная_загрузка отрицательная, функция INSTR
возвращает число начала запуска из символов в конце строки и затем выполняет поиск в начале строки.