select
SUBSTR(s, 1, INSTR(s, '-') - 1) as a,
SUBSTR(s, INSTR(s, '-', -1) + 1) as b
from
(select 'BR65437812-909@-@BR12340000-990' as s from dual)
Используя SUBSTR(string, start, length)
, мы имеем следующие аргументы:
Для A:
- строка для поиска
- 1 как
start
и
- (index_of_the_first_hyphen - 1) как
length
. INSTR(string, searchfor)
дает нам индекс первого дефиса
Для B:
Используя SUBSTR(string, start)
, у нас есть аргументы:
- строка для поиска
- the (index_of_last_hyphen + 1) - на этот раз мы используем дополнительный
INSTR(string, searchfor, startindex)
аргумент startindex
и устанавливаем его в -1; это заставляет его искать с конца строки и работать в обратном направлении, давая нам индекс последнего дефиса
Нам не нужен аргумент длины - SUBSTR без длины возвращает остаток строки до конца
Важно отметить, что INSTR с начальным индексом -1 выполняет поиск в обратном направлении, но всегда возвращает индекс с начала строки, а не с конца.
INSTR('dddde', 'd', -1)
12345 -- returns 4, because d is 4 from the start
54321 -- it does not return 2, even though d is 2 from the "start" when searching backwards