Поиск от конца строки в PL/SQL

Некоторые встроенные строковые функции Oracle PL/SQL, прежде всего SUBSTR и INSTR, позволяют задать начальную позицию для извлечения или поиска в обратном направлении от конца строки. Например, для извлечения последних 10 символов строки можно воспользоваться следующей командой: 

SUBSTR('Brighten the corner where you are',-10)

 

Функция возвращает строку «re you are». Обратите внимание на то, что в качестве начальной позиции указывается значение –10.

Задавая отрицательную начальную позицию, вы приказываете SUBSTR вести отсчет в обратном направлении от конца строки.

INSTR добавляет интересный нюанс: если задать отрицательный начальный индекс, функция INSTR:

  1. Отсчитывает указанное количество символов от конца строки, чтобы определить, откуда следует начать поиск.
  2. Проводит поиск в обратном направлении от заданной позиции к началу строки.

Шаг 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 позволила избавиться от циклического перебора. Код, приводящий к тем же результатам, получился более простым и элегантным. Конечно, такая замена возможна не всегда, и все же не стоит забывать об альтернативных решениях. В программировании всегда существует несколько путей к желаемому результату!

 

Вас заинтересует / Intresting for you:

Управление приложениями PL/SQL...
Управление приложениями PL/SQL... 3107 просмотров Stas Belkov Thu, 16 Jul 2020, 06:20:48
Встроенные методы коллекций PL...
Встроенные методы коллекций PL... 6993 просмотров sepia Tue, 29 Oct 2019, 09:54:01
Символьные функции и аргументы...
Символьные функции и аргументы... 10836 просмотров Анатолий Wed, 23 May 2018, 18:54:01
Тип данных RAW в PL/SQL
Тип данных RAW в PL/SQL 5732 просмотров Doctor Thu, 12 Jul 2018, 08:41:33
Войдите чтобы комментировать