Читать в оригинале

<< Предыдущая Оглавление Следующая >>


5.7 Строковые и символьные функции

В этой части речь пойдет о функциях работы с текстовой информаци­ей, которые могут применяться в запросах и программном коде на языке PL/SQL.

Функция CONCAT(strl, str2)

Данная функция выполняет конкатенацию строк strl и str2. Если один из аргументов равен NULL, то он воспринимается как пустая строка. Если оба аргумента равны NULL, то функция возвращает NULL. Пример:

SELECT CONCAT('У попа \ 'была собака') x1,
CONCATCTest' , NULL) х2,
CONCAT(NULL, 'Test') х3,
CONCAT(NULL, NULL) x4
FROM dual

X1

Х2

Х3

Х4

У попа была собака

Test

Test

NULL

Для конкатенации строк Oracle поддерживает специальный оператор конкатенации «||», который работает аналогично функции CONCAT, на­пример:

SELECT CONCAT('У попа \ 'была собака') x1, 'У попа ' || 'была собака' х2
FROM dual

X1

Х2

У попа была собака

У попа была собака

Не следует путать оператор конкатенации «||», эквивалентный вызо­ву функции CONCAT, и оператор «+», применяемый в арифметических операциях. В Oracle это разные операторы, но за счет автоматического приведения типов возможны трудноуловимые ошибки, например:

SELECT '5' + '3' x1
FROM dual

В данном случае возвращается числовое значение 8, а не текстовая строка «53». Это связано с тем, что, обнаружив арифметическую опе­рацию «+», Oracle автоматически пытается привести аргументы к типу NUMBER.

Функция LOWER(str)

Функция LOWER преобразует все символы строки str в строчные. Пример:

SELECT LOWER('TeXt DATA') X
FROM dual

Функция UPPER(str)

Функция UPPER преобразует все символы строки str в прописные. Пример:

SELECT UPPER('TeXt DATA') X
FROM dual

Функция INITCAP(str)

Возвращает строку str, в которой первые буквы всех слов преобразо­ваны в прописные. Функция удобна для форматирования полного имени при построении отчетов. Пример:

SELECT INITCAPCИваноВ петр сиДорович') X
FROM dual

Функции LTRIM(str [,set]) и RTRIM(str [,set])

Функция LTRIM удаляет все символы с начала строки до первого сим­вола, которого нет в наборе символов set. По умолчанию set состоит из одного пробела и может не указываться. Функция RTRIM аналогич­на LTRIM, но удаляет символы, начиная от конца строки. Рассмотрим несколько примеров:

SELECT LTRIM(' TeXt DATA') X1,
LTRIM(' _ # TeXt DATA', ' #_') X2,
LTRIM(' 1234567890 TeXt DATA', ' 1234567890') X3
FROM dual

X1

X2

X3

TeXt DATA

TeXt DATA

TeXt DATA

Функция REPLACE(str, search_str, [,replace_str])

Функция REPLACE осуществляет поиск образца search_str в строке str и каждое найденное вхождение заменяет на replace_str. По умолча­нию replace_str равен пустой строке, поэтому вызов функции REPLACE с двумя аргументами приводит к удалению всех найденных вхождений. Поиск подстроки ведется с учетом регистра. Пример:

SELECT REPLACE('У попа была собака', 'собака', 'кошка') x1,
REPLACE('У попа была злая собака', 'злая') х2,
REPLACE('У попа была собака', 'Собака', 'Кошка') х3
FROM dual

X1

Х2

ХЗ

У попа была кошка

У попа была собака

У попа была собака

Функция 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('Test 12345', 'e234', 'E') x2
FROM dual

X1

Х2

TEst 1!345

TEst 15

Данная функция удобна для решения ряда практических задач, свя­занных с перекодировкой символов или с поиском запрещенных симво­лов. Например, необходимо проанализировать пароль и выяснить, содер­жит ли он хотя бы одну цифру. Реализация данной проверки при помощи TRANSLATE имеет вид:

IF TRANSLATE(PassWd, '0123456789', '*') = PassWd THEN
ADD_ERR0R('Ошибка - Пароль должен содержать хотя бы одну цифру !');
RETURN 1;
END IF;

Другой пример: идет подготовка числа к его преобразованию в NUMBER. Необходимо заменить разделители десятичных знаков «,» и «.» на «.» и удалить пробелы. Реализация данной операции при помощи TRANSLATE имеет вид:

SELECT TRANSLATE('123 455,23', '., ', ' . . ') x1,
TRANSLATE('-123 455.23', '., ', ' . . ') х2
FROM dual

X1

Х2

123455.23

-123455.23

Функция SUBSTR(str, m [,n])

Функция SUBSTR возвращает фрагмент строки str, начиная с символа m длиной n символов. Длину можно не указывать — в этом случае возвра­щается строка от символа m и до конца строки str. Нумерация символов идет с 1. Если указать m = 0, то копирование все равно начнется с первого символа. Задание отрицательного значения m приводит к тому, что симво­лы отсчитываются от конца строки, а не от начала. Задание значений m, превышающих по абсолютному значению длину строки, приводит к тому, что функция возвращает NULL.

Пример:

SELECT SUBSTR('У попа была собака', 13) x1,
SUBSTR('У попа была собака', -6) х2,
SUBSTR('Эto тестовый текст', 5, 8) х3,
SUBSTR('У попа была собака', 150) х4
FROM dual

X1

X2

Х3

X4

собака

собака

текстовый

NULL

Функция INSTR(str, search_str [,n[,m]])

Функция INSTR возвращает позицию первого символа m-ro фрагмента строки str, совпадающего со строкой search_str. Сравнение ведется с n-го символа строки str, при сравнении учитывается регистр. По умолчанию n = m = 1, то есть поиск ведется от начала строки и возвращается позиция первого найденного фрагмента. В случае неуспешного поиска функция возвращает 0.

Примеры:

SELECT INSTR('y попа была собака', 'собака') x1,
INSTR('y попа была собака', 'кошка') х2,
INSTR('Это текст для демонстрации поиска текста', 'текст', 1, 2) х3,
INSTR(‘11111000000001', '1', 7) х4
FROM dual

X1

X2

X3

X4

13

0

35

14

С данной функций, равно как и со всеми остальными в Oracle, часто допускаются типовые ошибки, связанные с обработкой значения NULL. Если str=NULL, то функция вернет NULL, а не ноль! Это необходимо учитывать при построении различных условий. Например, данный фраг­мент программы на PL/SQL как раз не учитывает эту особенность:

IF INSTR(TXT_VAR, '*') = 0 THEN
...
END IF;

В данном случае правильно было бы написать так:

IF NVL(INSTR(TXT_VAR, '*'), 0) = 0 THEN
...
END IF;

Функции LENGTH (str) и LENGTHB (str)

Функция LENGTH (str) возвращает длину строки str в символах. Для пустой строки и значения NULL функция возвращает NULL, поэтому сов­местно с данной функцией рекомендуется использовать NVL.

Пример:

SELECT LENGTH('У попа была собака') x1,
LENGTH('') х2,
LENGTH(NULL) х3,
NVL(LENGTH(''), 0) х4
FROM dual

X1

X2

X3

X4

18

NULL

NULL

0

Функция LENGTHB аналогична функции LENGTH, но возвращает длину строки в байтах.

Функция ASCII(str)

Возвращает ASCII-код первого символа строки str в случае применения кодировки ASCII и значение первого байта многобайтного символа при использовании кодировки на основе многобайтных символов. Пример:

SELECT ASCII('Test') x1 FROM dual

Функция CHR(n)

Возвращает символ по его коду.

Пример:

SELECT CHR(64) x1
FROM dual



<< Предыдущая Оглавление Следующая >>