Некоторые встроенные строковые функции Oracle PL/SQL, прежде всего SUBSTR
и INSTR
, позволяют задать начальную позицию для извлечения или поиска в обратном направлении от конца строки. Например, для извлечения последних 10 символов строки можно воспользоваться следующей командой:
SUBSTR('Brighten the corner where you are',-10)
Функция возвращает строку «re you are
». Обратите внимание на то, что в качестве начальной позиции указывается значение –10.
Задавая отрицательную начальную позицию, вы приказываете SUBSTR
вести отсчет в обратном направлении от конца строки.
INSTR добавляет интересный нюанс: если задать отрицательный начальный индекс, функция INSTR
:
- Отсчитывает указанное количество символов от конца строки, чтобы определить, откуда следует начать поиск.
- Проводит поиск в обратном направлении от заданной позиции к началу строки.
Шаг 1 работает так же, как и у SUBSTR
, но на шаге 2 перемещение происходит в обратном направлении. Например, следующая команда ищет второе вхождение «re
» от конца строки:
INSTR('Brighten the corner where you are','re',-1,2)
Чтобы вам было проще понять смысл происходящего, обозначим позиции букв в строке:
111111111122222222223333 123456789012345678901234567890123 INSTR('Brighten the corner where you are','re',-1,2)
Результат равен 24. Четвертый параметр — 2 — запрашивает второе вхождение подстроки «re
». Третий параметр равен –1, так что поиск начинается от последнего символа строки (символа, непосредственно предшествующего закрывающей кавычке). Поиск ведется от конца к началу, от «re
» в конце «are
» (первое вхождение) и до «re
» в конце «where
».
Все эти операции поиска-замены утомительны. Иногда сложность кода удается сократить за счет нетривиального использования некоторых встроенных функций. Давайте воспользуемся функцией REPLACE
для замены всех запятых символами новой строки:
DECLARE names VARCHAR2(60) := 'Anna,Matt,Joe,Nathan,Andrew,Aaron,Jeff'; BEGIN DBMS_OUTPUT.PUT_LINE( REPLACE(names, ',', chr(10)) ); END; Результат: Anna Matt Joe Nathan Andrew Aaron Jeff
Функция REPLACE
позволила избавиться от циклического перебора. Код, приводящий к тем же результатам, получился более простым и элегантным. Конечно, такая замена возможна не всегда, и все же не стоит забывать об альтернативных решениях. В программировании всегда существует несколько путей к желаемому результату!