Разделить строку по разделительной позиции с помощью 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 возвращает число начала запуска из символов в конце строки и затем выполняет поиск в начале строки.