5.7 Строковые и символьные функцииВ этой части речь пойдет о функциях работы с текстовой информацией, которые могут применяться в запросах и программном коде на языке PL/SQL. Функция CONCAT(strl, str2) Данная функция выполняет конкатенацию строк strl и str2. Если один из аргументов равен NULL, то он воспринимается как пустая строка. Если оба аргумента равны NULL, то функция возвращает NULL. Пример: SELECT CONCAT('У попа \ 'была собака') x1,
Для конкатенации строк Oracle поддерживает специальный оператор конкатенации «||», который работает аналогично функции CONCAT, например: SELECT CONCAT('У попа \ 'была собака') x1, 'У попа ' || 'была собака' х2
Не следует путать оператор конкатенации «||», эквивалентный вызову функции CONCAT, и оператор «+», применяемый в арифметических операциях. В Oracle это разные операторы, но за счет автоматического приведения типов возможны трудноуловимые ошибки, например: SELECT '5' + '3' x1 В данном случае возвращается числовое значение 8, а не текстовая строка «53». Это связано с тем, что, обнаружив арифметическую операцию «+», Oracle автоматически пытается привести аргументы к типу NUMBER. Функция LOWER(str) Функция LOWER преобразует все символы строки str в строчные. Пример: SELECT LOWER('TeXt DATA') X Функция UPPER(str) Функция UPPER преобразует все символы строки str в прописные. Пример: SELECT UPPER('TeXt DATA') X Функция INITCAP(str) Возвращает строку str, в которой первые буквы всех слов преобразованы в прописные. Функция удобна для форматирования полного имени при построении отчетов. Пример: SELECT INITCAPCИваноВ петр сиДорович') X Функции LTRIM(str [,set]) и RTRIM(str [,set]) Функция LTRIM удаляет все символы с начала строки до первого символа, которого нет в наборе символов set. По умолчанию set состоит из одного пробела и может не указываться. Функция RTRIM аналогична LTRIM, но удаляет символы, начиная от конца строки. Рассмотрим несколько примеров: SELECT LTRIM(' TeXt DATA') X1,
Функция REPLACE(str, search_str, [,replace_str]) Функция REPLACE осуществляет поиск образца search_str в строке str и каждое найденное вхождение заменяет на replace_str. По умолчанию replace_str равен пустой строке, поэтому вызов функции REPLACE с двумя аргументами приводит к удалению всех найденных вхождений. Поиск подстроки ведется с учетом регистра. Пример: SELECT REPLACE('У попа была собака', 'собака', 'кошка') x1,
Функция TRANSLATE(str, from_mask, to_mask) Функция TRANSLATE анализирует строку str и заменяет в ней все символы, встречающиеся в строке from_mask, на соответствующие символы из to_mask. Для корректной работы функции строки from_mask и to_mask должны иметь одинаковую длину или строка from_mask должна быть длиннее, чем to_mask. Если from_mask длиннее, чем to_mask, и в процессе обработки строки str обнаружатся символы, соответствующие одному из символов from_mask, и при этом им не найдется соответствия в to_mask, то такие символы будут удалены из строки str. Если передать from_mask или to_mask, равное NULL, то функция возвратит значение NULL. Сравнение производится с учетом регистра. Примеры: SELECT TRANSLATE('Test 12345', 'е2\ 'Е!') x1,
Данная функция удобна для решения ряда практических задач, связанных с перекодировкой символов или с поиском запрещенных символов. Например, необходимо проанализировать пароль и выяснить, содержит ли он хотя бы одну цифру. Реализация данной проверки при помощи TRANSLATE имеет вид: IF TRANSLATE(PassWd, '0123456789', '*') = PassWd THEN Другой пример: идет подготовка числа к его преобразованию в NUMBER. Необходимо заменить разделители десятичных знаков «,» и «.» на «.» и удалить пробелы. Реализация данной операции при помощи TRANSLATE имеет вид: SELECT TRANSLATE('123 455,23', '., ', ' . . ') x1,
Функция SUBSTR(str, m [,n]) Функция SUBSTR возвращает фрагмент строки str, начиная с символа m длиной n символов. Длину можно не указывать — в этом случае возвращается строка от символа m и до конца строки str. Нумерация символов идет с 1. Если указать m = 0, то копирование все равно начнется с первого символа. Задание отрицательного значения m приводит к тому, что символы отсчитываются от конца строки, а не от начала. Задание значений m, превышающих по абсолютному значению длину строки, приводит к тому, что функция возвращает NULL. Пример: SELECT SUBSTR('У попа была собака', 13) x1,
Функция INSTR(str, search_str [,n[,m]]) Функция INSTR возвращает позицию первого символа m-ro фрагмента строки str, совпадающего со строкой search_str. Сравнение ведется с n-го символа строки str, при сравнении учитывается регистр. По умолчанию n = m = 1, то есть поиск ведется от начала строки и возвращается позиция первого найденного фрагмента. В случае неуспешного поиска функция возвращает 0. Примеры: SELECT INSTR('y попа была собака', 'собака') x1,
С данной функций, равно как и со всеми остальными в Oracle, часто допускаются типовые ошибки, связанные с обработкой значения NULL. Если str=NULL, то функция вернет NULL, а не ноль! Это необходимо учитывать при построении различных условий. Например, данный фрагмент программы на PL/SQL как раз не учитывает эту особенность: IF INSTR(TXT_VAR, '*') = 0 THEN В данном случае правильно было бы написать так: IF NVL(INSTR(TXT_VAR, '*'), 0) = 0 THEN Функции LENGTH (str) и LENGTHB (str) Функция LENGTH (str) возвращает длину строки str в символах. Для пустой строки и значения NULL функция возвращает NULL, поэтому совместно с данной функцией рекомендуется использовать NVL. Пример: SELECT LENGTH('У попа была собака') x1,
Функция LENGTHB аналогична функции LENGTH, но возвращает длину строки в байтах. Функция ASCII(str) Возвращает ASCII-код первого символа строки str в случае применения кодировки ASCII и значение первого байта многобайтного символа при использовании кодировки на основе многобайтных символов. Пример: SELECT ASCII('Test') x1 FROM dual Функция CHR(n) Возвращает символ по его коду. Пример: SELECT CHR(64) x1
|