
Текстовые функции
Текстовые функции, называемые в Oracle символьными функциями (character functions), оперируют с текстовыми строками. Чаще всего с текстовыми строками требуется делать следующее: изменять регистр символов (на верхний, нижний или смешанный); разбивать длинные строки на несколько более коротких подстрок; очищать текст, поступающий из внешнего источника, от избыточных пробелов в конце.
UPPER, LOWER и INITCAP
Эти три функции меняют регистр переданного им текста: UPPER устанавливает верхний регистр буквенных символов в тексте, LOWER - нижний регистр, а INITCAP устанавливает верхний регистр для первой буквы каждого слова в тексте.
Например, следующие команды
SELECT UPPER (product_name) FROM product;
SELECT LOWER (product_name) FROM product;
SELECT INITCAP(product_name) FROM product;
дают результаты, показанные ниже:
SQL> SELECT UPPER(product_name) FROM product;
UPPER(PRODUCT_NAME)
---------------------------------------------
smail midget
medium wodget
chrome phoobar
round chrome snaphoo
extra huge mega phoobar +
SQL> SELECT LOWER(product_name) FROM product;
LOWER(PRODUCT_NAME)
----------------------------------------------
smail midget
medium wodget
chrome phoobar
round chrome snaphoo
extra huge mega phoobar +
SQL> SELECT INITCAP (product_name) FROM product;
INITCAP(PRODUCT_NAME)
Small Widget
Medium Wodget
Chrome Phoobar
Round Chrome Snaphoo
Extra Huge Mega Phoobar +
Как можно заметить, функция INITCAP в данном случае ничего не делает, поскольку каждое слово в названиях товаров и так начинается с большой буквы. Способность этой функции наводить порядок в тексте гораздо лучше демонстрирует следующая команда:
SELECT INITCAP( ' this TEXT hAd UNpredictABLE caSE' ) FROM DUAL;
Из всех трех символьных функций, меняющих регистр, чаще всего используется функция UPPER. Она очень полезна в операторах SELECT, когда нет уверенности, какими буквами был набран текст в столбце. В таких случаях достаточно подставить имя столбца в функцию UPPER, а искомый текст набрать в верхнем регистре:
SELECT * FROM product
WHERE UPPER(product_name) LIKE '%PHOOBAR%';
LENGTH
Временами требуется определять длину данных, хранимых в столбце таблицы. Такую возможность предоставляет функция LENGTH. Представим, например, что используется таблица, похожая на таблицу PRODUCT, и названия товаров из нее поступают в отдел каталогов. Там рассматривают возможность уменьшения размера страницы каталога, а новый размер требует сокращения длины названий товаров с 25 до 15 символов. Чтобы принять окончательное решение, в отделе хотели бы знать, сколько названий придется изменить. Можно составить список названий, требующих изменения, при помощи следующей команды:
SELECT product_name, LENGTH(product_name) NAME_LENGTH
FROM product
WHERE LENGTH(product_name) > 15
ORDER BY product_name;
Для столбца с длинами названий товаров здесь использован псевдоним NAME_LENGTH, чтобы заголовки столбцов было удобнее читать.
Функция LENGTH полезна также для определения максимальной и средней длины текста в столбце.
SUBSTR
Часто возникает ненобходимость разделять многосимвольные данные столбца на части. Например, может потребоваться преобразовать столбец такого вида
ITEM_ID
LA-101
LA-102
NY-101
NY-102
в несколько столбцов, например, таким образом:
LOCATION ITEM_NUMBER
LA 101
LA 102
NY 101
NY 102
Для выполнения данной операции Oracle предоставляет функцию SUBSTR:
SUBSTR (исходный_текст , позиция_начального_символа , количество_символов)
Чтобы разрезать строку на подстроки, необходимо указать, в какой позиции должна начинаться подстрока и какой длины она должна быть. В предыдущем примере первая подстрока содержит местонахождение производителя. Она начинается с первой позиции столбца ITEM_ID и имеет длину в два символа. Следующая подстрока содержит номер изделия, начинается с четвертой позиции и имеет длину в три символа.
Значение исходный_текст обычно представляет собой имя столбца, подлежащего разбору. Позиция_началъного_символа — это символ, с которого будет начинаться подстрока, а количество_символов — общее количество символов, которое она должна содержать. Разобрать идентификатор изделия на местонахождение производителя и номер изделия позволяет следующая команда:
SELECT SUBSTR(item_id, 1, 2) LOCATION,
SUBSTR(item_id, 4, 3) ITEM_NUMBER FROM old_item
Разбор строк очень часто требуется при переносе данных из одного приложения в другое, поскольку два приложения практически никогда не хранят данные абсолютно одинаковым образом.
INSTR
Функция INSTR ищет указанный текст и возвращает число, обозначающее начальную позицию этого текста в строке. Используя это число для определения длины первой подстроки и начальной позиции следующей подстроки, можно делить длинные строки на части, независимо оттого, как они устроены.
Синтаксис функции INSTR выглядит следующим образом:
INSTR(ucxoдный_meкcm , текст _для_поиска , позиция_началъного_символа)
Как правило, исходный_текст представляет собой имя столбца, содержащего длинную строку, которую нужно разобрать. Текст_для_поиска — это текст, который вы хотите найти, а позиция_начального_символа определяет номер символа исходного текста, с которого будет начат поиск (чтобы поиск выполнялся с самого начала текста, указывается значение 1).
Функция INSTR может помочь в разделении столбца ITEM_ID таблицы OLD_ITEM нa две части. Все, что нужно сделать, — это найти положение символа, отделяющего местонахождение производителя от его номера. Используя возвращенное функцией число, можно указать правильный размер для местонахождение производителя , а также начальную позицию для его номера:
SELECT SUBSTR(item_id, 1, INSTR(item_id, '-' , 1 ) -1 ) LOCATION,
SUBSTR(item_id, INSTR(item_id, '-' , 1 ) +1), 3) ITEM_NUMBER FROM old_item
LTRIM и RTRIM
Процесс удаления избыточных пробелов в начале или конце текстовой строки называется обрезанием (trimming), и для этого в Oracle есть две функции: LTRIM и RTRIM. Функция LTRIM удаляет пробелы в начале строки, а функция RTRIM — в конце. Они имеют одинаковый синтаксис:
LTRIM (имя_столбца)
RTRIM (имя_столбца)