Урок 7. Строковые функции SQL


Содержание материала:

SQL-Урок 7. Функции обработки данных

Как и в большинстве языков программирования, в SQL существуют функции для обработки данных. Стоит отметить, что в отличие от SQL-операторов, функции не стандартизованы для всех видов СУБД, то есть для выполнения одних и тех же операции над данными, разные СУБД имеют свои собственные имена функций. Это означает, что код запроса написан в одной СУБД может не работать в другой, и это нужно учитывать в дальнейшем. Больше всего это касается функций для обработки текстовых значений, преобразования типов данных и манипуляций над датами.

Обычно СУБД поддерживается стандартный набор типов функций, а именно:

  • Текстовые функции, которые используются для обработки текста (выделение части символов в тексте, определение длины текста, перевод символов в верхний или нижний регистр . )
  • Числовые функции. Используются для выполнения математических операций над числовыми значениями
  • Функции даты и времени (осуществляют манипулирования датой и временем, рассчитывают период между датами, проверяют даты на корректность и т.п.)
  • Статистические функции (для вычисления максимальных /минимальных значений, средних значений, подсчет количества и суммы . )
  • Системные функции (предоставляют разного рода служебную информацию о СУБД, пользователе и др..).

1. Функции SQL для обработки текста

Реализация SQL в СУБД Access имеет следующие функции для обработки текста:

LEFT() Отбирает символы в тексте слева RIGHT() Отбирает символы в тексте справа MID() Отбирает символы с середины текста UCase() Переводит символы в верхний регистр LCase() Переводит символы в нижний регистр LTrim() Удаляет все пустые символы слева от текста RTrim() Удаляет все пустые символы справа от текста Trim() Удаляет все пустые символы с обеих сторон текста

Переведем названия товаров в верхний регистр с помощью функции UCase():

SELECT Product, UCase(Product) AS Product_UCase FROM Sumproduct

Выделим первые три символа в тексте с помощью функции LEFT():

SELECT Product, LEFT(Product, 3) AS Product_LEFT FROM Sumproduct

2. Функции SQL для обработки чисел

Функции обработки чисел предназначены для выполнения математических операций над числовыми данными. Эти функции предназначены для алгебраических и геометрических вычислений, поэтому они используются значительно реже функций обработки даты и времени. Однако числовые функции наиболее стандартизированными для всех версий SQL. Давайте взглянем на перечень числовых функций:

SQR() Возвращает корень квадратный указанного числа ABS() Возвращает абсолютное значение числа EXP() Возвращает экспоненту указанного числа SIN() Возвращает синус указанного угла COS() Возвращает косинус указанного угла TAN() Возвращает тангенс указанного угла

Мы привели лишь несколько основных функций, однако вы всегда можете обратиться к документации вашей СУБД, чтобы увидеть полный перечень функций, которые поддерживаются с их подробным описанием.

Например, напишем запрос для получения корня квадратного для чисел в столбце Amount с помощью функции SQR():

SELECT Amount, SQR(Amount) AS Amount_SQR FROM Sumproduct

3. Функции SQL для обработки даты и времени

Функции манипулирования датой и временем являются одними из важнейших и часто используемых функций SQL. В базах данных значения дат и времени хранятся в специальном формате, поэтому их невозможно использовать напрямую без дополнительной обработки. Каждая СУБД имеет свой набор функций для обработки дат, что, к сожалению, не позволяет переносить их на другие платформы и реализации SQL.

Список некоторых функций для обработки даты и времени в СУБД Access:

DatePart() Возвращает часть даты: год, квартал, месяц, неделя, день, час, минуты, секунды Year(), Month() Возвращает год и месяц соответственно Hour(), Minute(), Second() Возвращает час, минуты и секунды указанной даты WeekdayName() Возвращает название дня недели

Посмотрим на примере как работает функция DatePart():

SELECT Date1, DatePart(«m», Date1) AS Month1 FROM Sumproduct

Функция DatePart () имеет дополнительный параметр, который нам позволяет отобразить необходимую часть даты. В примере мы использовали параметр «m» , который отображает номер месяца (таким же образом мы можем отразить год — «yyyy» , квартал — «q «, день — » d «, неделю — » w «, час — » h «, минуты — «n» , секунды — «s» и т.д.).

4. Статистические функции SQL

Статистические функции помогают нам получить готовые данные без их выборки. SQL-запросы с этими функциями часто используются для анализа и создания различных отчетов. Примером таких выборок может быть: определение количества строк в таблице, получение суммы значений по определенному полю, поиск наибольшего /наименьшего или среднего значения в указанном столбце таблицы. Также отметим, что статистические функции поддерживаются всеми СУБД без особых изменений в написании.

Список статистических функций в СУБД Access:

COUNT() Возвращает число строк в таблице или столбце SUM() Возвращает сумму значений в столбце MIN() Возвращает наименьшее значение в столбце MAX() Возвращает наибольшее значение в столбце AVG() Возвращает среднее значение в столбце

Примеры использования функции COUNT():

SELECT COUNT(*) AS Count1 FROM Sumproduct — возвращает количество всех строк в таблице

SELECT COUNT(Product) AS Count2 FROM Sumproduct — возвращает количество всех непустых строк в поле Product

Мы намеренно удалили одно значение в столбце Product , чтобы показать разницу в работе двух запросов.

Примеры использования функции SUM():

SELECT SUM(Quantity) AS Sum1 FROM Sumproduct WHERE Month = ‘ April ‘

Данным запросу мы отразили общее количество проданного товара в апреле.

SELECT SUM(Quantity*Amount) AS Sum2 FROM Sumproduct

Как видим, в статистических функциях мы можем осуществлять вычисления над несколькими столбцами с использованием стандартных математических операторов.

Пример использования функции MIN():

SELECT MIN(Amount) AS Min1 FROM Sumproduct

Пример использования функции MAX():

SELECT MAX(Amount) AS Max1 FROM Sumproduct

Пример использования функции AVG():

SELECT AVG(Amount) AS Avg1 FROM Sumproduct

Встроенные функции

Функции для работы со строками

Для работы со строками в T-SQL можно применять следующие функции:

LEN : возвращает количество символов в строке. В качестве параметра в функцию передается строка, для которой надо найти длину:

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

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

CHARINDEX : возвращает индекс, по которому находится первое вхождение подстроки в строке. В качестве первого параметра передается подстрока, а в качестве второго — строка, в которой надо вести поиск:

PATINDEX : возвращает индекс, по которому находится первое вхождение определенного шаблона в строке:

LEFT : вырезает с начала строки определенное количество символов. Первый параметр функции — строка, а второй — количество символов, которые надо вырезать сначала строки:

RIGHT : вырезает с конца строки определенное количество символов. Первый параметр функции — строка, а второй — количество символов, которые надо вырезать сначала строки:

SUBSTRING : вырезает из строки подстроку определенной длиной, начиная с определенного индекса. Певый параметр функции — строка, второй — начальный индекс для вырезки, и третий параметр — количество вырезаемых символов:

REPLACE : заменяет одну подстроку другой в рамках строки. Первый параметр функции — строка, второй — подстрока, которую надо заменить, а третий — подстрока, на которую надо заменить:

REVERSE : переворачивает строку наоборот:

CONCAT : объединяет две строки в одну. В качестве параметра принимает от 2-х и более строк, которые надо соединить:

LOWER : переводит строку в нижний регистр:

UPPER : переводит строку в верхний регистр

SPACE : возвращает строку, которая содержит определенное количество пробелов

Например, возьмем таблицу:

И при извлечении данных применим строковые функции:

SLUSAR.SU

Логово Программиста

Изучаем SQL. №11.Изменяем поля. Строковые Функции SQL.

Всем привет, сегодня мы будем учиться вносить изменения в таблицу Базы Данных при выводе с помощью строковых функций.
Функция — Блок действий с название. Она может производить действия, а также возвращать значение на место вызова.
ВНИМАНИЕ! Строковые функции НЕ изменяют данные в самой таблице, а лишь выводят нужный результат, как будто эти изменения произошли.

Существуют такие функции:

RIGHT/LEFT(поле, количество символов) — функция вернет символы в заданном количестве слева/справа от значения в поле.

SUBSTRING_INDEX(поле,’разделитель’, номер разделителя) — функция вернет все символы до разделителя.

UPPER/LOWER(поле) — выводит значения в верхнем/нижнем регистре.

RTRIM/LTRIM(поле) — удалит пробелы справа/слева.

CONCAT(‘Строка1’, ‘Строка2’) — соединяет строки.

Итак, приступим. Для начала создадим новую базу данных narod, выберем ее и создадим таблицу ludi с полями id, imya, familiya, vozrast.

Теперь наполним нашу табличку и проверяем:

Итак, наша база создана и заполнена. Приступим к работе с функциями.
Для начала выведем на экран все значения столбца imya в верхнем регистре:

Показать последние 3 символа строк (или 3 символа справа) в столбце familiya:

Показать первые три символа (или 3 символа слева) первых 4 строк в столбце imya:

Теперь заполним поле imya последними двумя символами его же значений:

Теперь поместим туда же первые две буквы столбца familiya:

Удалим столбец imya и добавим столбец fio:

Конкатенацию строк в MYSQL

Теперь перенесем туда столбец familiya с добавлением Имен лишнего пробела в конце. Заодно изучим функцию конкатенацию строк в MYSQL она осущетвляется с помощью функции CONCAT(строка1,строка2). В обчном SQL можно использовать символ || между строками. В разных базах эти значения могут отличаться.
Ну что, приступим:

Теперь удалим все пробелы справа в колонке fio:

Теперь удалим колонку familiya и создадим колонки name и fam:

Теперь в колонку name перенесем имена из fio, а в колонку fam — фамилии и удалим fio:

на этом все, оставляйте комментарии. Буду рад ответить на вопросы.

Строковые функции SQL – примеры использования

Мы продолжаем изучение языка запросов SQL, и сегодня мы с Вами будем разговаривать о строковых функциях SQL. Мы рассмотрим основные и часто используемые строковые функции, такие как: LOWER, LTRIM, REPLACE и другие, все рассматривать мы будем, конечно же, на примерах.

В прошлой статье «Основы языка запросов SQL – оператор SELECT» мы с Вами узнали, что такое вообще SQL, а также рассмотрели основы оператора SELECT (условия отбора, агрегатные функции), здесь же мы продолжаем изучение оператора SELECT, а если говорить конкретней, то будем рассматривать строковые функции SQL.

Строковые функции используются для возвращения уже отредактированного значения. Другими словами, например, у Вас в колонке все значения состоят более чем из 20 символов, а Вам нужно возвратить всего первые 5 символов, это можно сделать с помощью так называемых строковых функциях.

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

Функция CONCAT

Начнем с функции CONCAT – она используется для объединения значений двух столбцов в один. Допустим у Вас в таблице, «Имя» и «Фамилия» находятся в разных колонках (что логично), а Вам, для какого-нибудь отчета, нужно чтобы они выводились в одной колонке. Вы можете легко использовать данную функцию.

С помощью данного запроса Вы объедините две колонки в одну, т.е. у Вас получится не вот так

Иван Иванов
Петр Петров
Иван Иванов
Петр Петров

Аналогично этому запросу можно использовать следующую конструкцию (применимо в PostgreSQL).

Или чтобы отделить пробелом введите

т.е. две вертикальные черты объединяют два столбца в один, а чтобы отделить их пробелом я поставил между ними пробел (можно использовать любой символ, например тире или двоеточие) в апострофах и объединил также двумя вертикальными чертами (в Transact-SQL вместо двух вертикальных черточек используется знак +).

Функция INITCAP

Дальше идет также очень полезная функция, INITCAP – которая возвращает значение в строке, в которой каждое слово начинается с заглавной буквы, а продолжается маленькими. Это нужно для того, если у Вас в той или иной колонке не соблюдают правила заполнения и для того чтобы вывести все это дело в красивом виде можно использовать данную функцию, например, у Вас в таблице записи в колонке name следующего вида: ИВАН иванов или петр петров, Вы применяете данную функцию.

И у Вас получится вот так.

Иван Иванов
Петр Петров

Функция LOWER

Следующая функция также может пригодиться. LOWER – возвращает в значение все слова с маленькой буквы. Используем пример выше, но только будем пользоваться следующий функцией.

А теперь получится вот так.

иван иванов
петр петров

Функция UPPER

Похожая функция, только возвращает все символы с заглавной буквы, это UPPER.

ИВАН ИВАНОВ
ПЕТР ПЕТРОВ

Функция LPAD

Далее идет функция LPAD — она пригодится Вам, если Вам необходимо дополнить слева некими символами, до определенного количества знаков. Допустим, Вам необходимо, чтобы длина поля «Имя» была 20 знаков, и если длина имени меньше (например, «Иван» явно меньше 20 знаков), то будет происходить дополнение слева специальным символом (для примера используем тире).

—————-Иван
—————Сергей
  • name – название колонки;
  • 20 – количество знаков (длина поля);
  • ‘-‘ – символ, которым нужно дополнить до необходимого количества знаков.

Функция RPAD

Сразу рассмотрим обратную функцию. RPAD – действие и синтаксис тот же что и у LPAD, только дополняются символы справа (в LPAD слева).

Иван—————-
Сергей—————

Функция LTRIM

Далее идет тоже в некоторых случаях полезная функция, LTRIM – эта функция удаляет крайние левые символы, которые Вы укажите. Например, у Вас в базе есть колонка «город», в которой город указан в виде «г.Москва», а также есть города которые указанны в виде просто «Москва». Но Вам нужно вывести отчет только в виде «Москва» без «г.», но как это сделать, если есть и такие и такие? Вы просто указываете своего рода шаблон «г.» и если крайние левые символы начинаются с «г.», то эти символы просто не будут выводиться.

г.Москва Москва Москва Москва г.Калуга Калуга

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

Функция RTRIM

Также давайте сразу рассмотрим обратную функцию. RTRIM – то же самое что и LTRIM только символы ищутся справа.

Примечание! В Transact-SQL функции RTRIM и LTRIM удаляют пробелы справа и слева соответственно.

Функция REPLACE

Теперь рассмотрим такую интересную функцию как REPLACE – она возвращает строку, в которой все совпадения символов, заменяются на Ваши символы, которые Вы укажите. Для чего ее можно использовать, например, у Вас в базе есть колонки, в которых встречаются некие разделительные символы, допустим «/». Например, Иван/Иванов, а Вам хотелось бы вывести Иван-Иванов, то напишите

и у Вас произойдет замена символов.

Данная функция заменяет только полное совпадение символов, если например Вы укажите «—» т.е. три тире она и будет искать только три тире, а каждое отдельное тире заменять не будет, в отличие от следующей функции.

Функция TRANSLATE

TRANSLATE – строковая функция, которая заменяет все символы в строке, на те символы, которые Вы укажите. Исходя из названия функции, можно догадаться, что это полный перевод строки. Отличие данной функции от REPLACE в том, что она заменяет каждый символ, который Вы укажите, т.е. у Вас есть три символа, допустим абв и с помощью TRANSLATE Вы его можете заменить на abc таким образом у Вас а=a, б=b, в=c и по такому принципу будут заменяться все совпадения символов. А если Вы заменяли с помощью REPLACE, то у Вас искалось только полное совпадение символов абв расположенных подряд.

Функция SUBSTR

SUBSTR – данная функция, возвращает только тот диапазон символов, который Вы укажите. Другими словами, допустим, строка из 10 символов, а Вам все десять не нужны, а допустим, нужны только 3-8 (с третьего по восьмой). С помощью данной функции Вы легко можете это сделать. Например, у Вас в базе есть какой-нибудь идентификатор, фиксированной длинны (типа: AA-BB-55-66-CC) и каждая комбинация символов что-то означает. И в один прекрасный момент Вам сказали вывести только 2 и 3 комбинацию символов, для этого вы пишите запрос следующего вида.

т.е. мы выводим все символы, начиная с 4 и заканчивая 8, и после этого запроса у Вас выведется вот это:

BB-55

Функция LENGTH – длина строки

Следующая функция также может пригодиться, это LENGTH – которая просто на всего считает количество символов в строке. Например, Вам нужно узнать, сколько символов в каждой ячейки столбца допустим «name», таблица следующего вида.

Иван
Сергей
Виталий

после этого запроса Вы получите вот это.

4
6
7

Вот мы с Вами и рассмотрели основные строковые функции SQL. В следующих статьях мы продолжим изучение SQL.

О строковых функциях SQL или как манипулировать текстом в базе данных MySQL

Здравствуйте, уважаемые читатели блога webcodius.ru. Сегодня я хотел бы поговорить о языке SQL, а в частности о функциях для обработки текста. Для создания и управления сайтом часто бывает не обязательно знание языка SQL. Системы управления контентом позволяют редактировать контент сайта без написания запросов. Но хотя бы поверхностное знакомство с структурированным языком запросов поможет вам значительно ускорить модификацию и управление данными в базе данных вашего сайта.

Передо мной частенько возникают задачи: удалить часть текста из текстовых полей базы данных, объединить строковые данные или еще что-нибудь связанное с текстом. Делать все это через админские панели сайтов очень неудобно и муторно. Гораздо проще бывает написать запрос к базе данных выполняющий все эти действия за пару секунд.

Символьные функции в языке sql

Начнем по порядку с самого простого. Первой рассмотрим строковую функцию ASCII, которая используется для определения ASCII-кода текстовых символов:

integer ASCII(str string)

Функция возвращает целое значение — ASCII-код первого левого символа строки str. В случае если строка str пустая возвращает 0 и NULL если строка str не существует.

SELECT ASCII (‘t’);
Результат: 116
SELECT ASCII (‘test’);
Результат: 116
SELECT ASCII (1);
Результат: 49

Далее функция ORD, которая также определяет ASCII- код символов, но может обрабатывать также многобайтовые символы:

integer ORD(str string)

Если первый левый символ строки str многобайтовый, то возвращает его код в формате: ((первый байт ASCII- код)*256+(второй байт ASCII -код))[*256+третий байт ASCII -код. ]. В случае если первый левый символ строки str не является многобайтовым, работает как функция ASCII — возвращает его ASCII-код.

SELECT ORD (‘test’);
Результат: 116

Функция CHAR, тесно связанная с функцией ASCII и выполняет обратное действие:

string CHAR(int integer, . )

Функция CHAR возвращает строку символов по их ASCII-кодам. Если среди значений встречается значение NULL, то оно пропускается.

SELECT CHAR ( 116, ‘101’, 115, ‘116’ );
Результат: ‘test’

SQL функции для объединения строк

Одна из самых популярных категорий функций. Ведь частенько бывает нужно объединить значения нескольких полей таблиц базы данных сайта. В языке SQL есть сразу несколько функций для конкатенации строк.

string CONCAT(str1 string, str2 string. )

Функция возвращает строку, созданную путем объединения аргументов. Можно указывать более двух аргументов. Если один из аргументов является NULL, то и возвращаемый результат будет NULL. Числовые значения преобразуются в строку.

SELECT CONCAT (‘Hello’, ‘ ‘, ‘world’, ‘!’);
Результат: ‘Hello world!’
SELECT CONCAT (‘Hello’, NULL, ‘world’, ‘!’);
Результат: NULL
SELECT CONCAT (‘Число пи’, ‘=’, 3.14);
Результат: ‘Число пи=3.14’

Как видно из примеров, строки объединяются без разделителей. Для того чтобы разделить слова в первом примере в качестве аргумента приходится использовать пробел. Если бы слов было больше, то каждый раз вставлять пробелы было бы не очень удобно.

Для таких случаев существует функция CONCAT_WS:

string CONCAT_WS(separator string, str1 string, str2 string. )

Функция объединяет строки как и функция CONCAT, но вставляет между аргументами разделитель separator. В случае если аргумент separator является NULL, то и результат будет NULL. Аргументы строки равные NULL пропускаются.

SELECT CONCAT_WS (‘ ‘, ‘Иванов’, ‘Иван’, ‘Иванович’);
Результат: ‘Иванов Иван Иванович’
SELECT CONCAT_WS (NULL, ‘Иванов’, ‘Иван’, ‘Иванович’);
Результат: NULL
SELECT CONCAT_WS (‘ ‘, ‘Иванов’, NULL, ‘Иван’, ‘Иванович’);
Результат: »Иванов Иван Иванович’

В случае объединения большого количества строк, которые необходимо отделять разделителем, функция CONCAT_WS гораздо удобнее функции CONCAT.

Иногда бывает необходимо удлинить строку до определенного количества символов за счет повторения какого-либо символа. Это тоже своего рода объединение строк. Для этого можно использовать функции LPAD и RPAD. Функции имеют следующий синтаксис:

string LPAD(str string, len integer, padstr string)
string RPAD(str string, len integer, padstr string)

Функция LPAD возвращает строку str дополненную слева строкой padstr до длины len. Функция RPAD выполняет тоже самое, только удлинение происходит с правой стороны.

SELECT LPAD (‘test’, 10, ‘.’);
Результат: . test
SELECT RPAD (‘test’, 10, ‘.’);
Результат: test.

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

SELECT LPAD (‘test’, 3, ‘.’);
Результат: tes

Определение длины строки в sql запросах

Для определения количества символов в строке в языке SQL отвечает функция LENGTH — длина строки:

integer LENGTH(str string)

Функция возвращает целое число равное количеству символов в строке str.

SELECT LENGTH (‘test’);
Результат: 4

В случае использования многобайтовых кодировок функция LENGTH выдает не правильный результат. Например в случае если задана кодировка unicode, то запрос:

SELECT LENGTH (‘тест’);

вернет 8. Что, легко заметить, в два раза больше реального количества символов. В этом случае нужно использовать функцию CHAR_LENGTH:

integer CHAR_LENGTH(str string)

Функция также возвращает длину строки str и поддерживает многобайтовые символы.

SELECT CHAR_LENGTH (‘тест’);
Результат: 4

Поиск подстроки в строке средствами sql

Для вычисления позиции подстроки в строке в языке sql существует несколько функций. Первая, которую мы рассмотрим, функция POSITION:

integer POSITION(substr string IN str string)

Возвращает номер позиции первого вхождения подстроки substr в строке str и возвращает 0 если подстрока не найдена. Функция POSITION может работать с многобайтовыми символами.

SELECT POSITION (‘cd’ IN ‘abcdcde’);
Результат: 3
SELECT POSITION (‘xy’ IN ‘abcdcde’);
Результат: 0

Следующая функция LOCATE позволяет начинать поиск подстроки с определенной позиции:

integer LOCATE(substr string, str string, pos integer)

Возвращает позицию первого вхождения подстроки substr в строке str, начиная с позиции pos. Если параметр pos не задан, то поиск осуществляется с начала строки. Если подстрока substr не найдена, то возвращает 0. Поддерживает многобайтовые символы.

SELECT LOCATE (‘cd’, ‘abcdcdde’, 5);
Результат: 5
SELECT LOCATE (‘cd’, ‘abcdcdde’);
Результат: 3

Аналогом функций POSITION и LOCATE является функция INSTR:

integer INSTR(str string, substr string)

Также как и функции выше возвращает позицию первого вхождения подстроки substr в строке str. Единственное отличие от функций POSITION и LOCATE то, что аргументы поменяны местами.

Далее рассмотрим функции, которые помогают получить подстроку.

Первыми рассмотрим сразу две функции LEFT и RIGHT, которые похожи по своему действию:

string LEFT(str string, len integer)
string RIGHT(str string, len integer)

Функция LEFT возвращает len первых символов из строки str, а функция RIGHT столько же последних. Поддерживают многобайтовые символы.

SELECT LEFT (‘Москва’, 3);
Результат: Мос
SELECT RIGHT (‘Москва’, 3);
Результат: ква

Далее рассмотрим одинаковые по итоговому результату функции SUBSTRING и MID:

string SUBSTRING(str string, pos integer, len integer)
string MID(str string, pos integer, len integer)

Функции позволяют получить подстроку строки str длиною len символов с позиции pos. В случае если параметр len не задан, то возвращается вся подстрока начиная с позиции pos.

SELECT SUBSTRING (‘г. Москва — столица России’, 4, 6);
Результат: Москва
SELECT SUBSTRING (‘г. Москва — столица России’, 4);
Результат: Москва — столица России

Примеры с функцией MID не привожу, потому что результаты будут аналогичные.

Интересная функция SUBSTRING_INDEX:

string SUBSTRING_INDEX(str string, delim string, count integer)

Функция возвращает подстроку строки str, полученную путем удаления символов, идущих после разделителя delim, находящимся в позиции count. Параметр count может быть как положительным, так отрицательным. Если count положительный, то отсчет позиции разделителя будет вестись слева и удаляться будут символы находящиеся справа от разделителя. Если count отрицательный, то отсчет позиции разделителя ведется справа и удаляются символы находящиеся слева от разделителя. Возможно, описание получилось слишком запутанным, но на примерах станет понятней.

SELECT SUBSTRING_INDEX (‘www.mysql.ru’, ‘.’, 1);
Результат: www

В данном примере функция находит, первое вхождения символа точки в строке «www.mysql.ru» и удаляет все символы, идущие после нее, включая сам разделитель.

SELECT SUBSTRING_INDEX (‘www.mysql.ru’, ‘.’, 2);
Результат: www.mysql

Здесь функция ищет второе вхождение точки, удаляет все символы справа от нее и возвращает получившуюся подстроку. И еще один пример с отрицательным значением параметра count:

SELECT SUBSTRING_INDEX (‘www.mysql.ru’, ‘.’, -2);
Результат: mysql.ru

В этом примере функция SUBSTRING_INDEX ищет вторую точку, отсчитывая позицию справа, удаляет символы слева от нее и выдает полученную подстроку.

Удаление пробелов из строки

Для удаления лишних пробелов из начала и конца строки в языке SQL есть три функции.

string LTRIM(str string)

Удаляет с начала строки str пробелы и возвращает результат.

string RTRIM(str string)

Также удаляет пробелы из строки str, только с конца. Обе функции поддерживают многобайтовые символы.

SELECT LTRIM (‘ текст ‘);
Результат: ‘текст ‘
SELECT RTRIM (‘ текст ‘);
Результат: ‘ текст’

И третья функция TRIM позволяет сразу удалять пробелы из начала и из конца строки:

string TRIM([[BOTH | LEADING | TRAILING] [remstr] string FROM] str string)

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

SELECT TRIM (‘ текст ‘);
Результат: ‘текст’

С помощью пара метра remstr можно задавать символы или подстроки, которые будут удаляться из начала и конца строки. С помощью управляющих параметров BOTH, LEADING, TRAILING можно задавать откуда будут удаляться символы:

  • BOTH — удаляет подстроку remstr с начала и с конца строки;
  • LEADING — удаляет remstr с начала строки;
  • TRAILING — удаляет remstr с конца строки.

SELECT TRIM (BOTH ‘а’ FROM ‘текст’);
Результат: ‘текст’
SELECT TRIM (LEADING ‘а’ FROM ‘текстааа’);
Результат: ‘текстааа’
SELECT TRIM (TRAILING ‘а’ FROM ‘ааатекст’);
Результат: ‘ааатекст’

Функция SPACE позволяет получить строку состоящую из определенного количества пробелов:

string SPACE(n integer)

Возвращает строку, которая состоит из n пробелов.

Функция REPLACE нужна для замены заданных символов в строке:

string REPLACE(str string, from_str string, to_str string)

Функция заменяет в строке str все подстроки from_str на to_str и возвращает результат. Поддерживает многобайтные символы.

SELECT REPLACE ( ‘замена подстроки’, ‘подстроки’, ‘текста’ )
Результат: ‘замена текста’

string REPEAT(str string, count integer)

Функция возвращает строку, которая состоит из count повторений строки str. Поддерживает многобайтовые символы.

Топ-пост этого месяца:  Как повлиять на анонсы записей

SELECT REPEAT (‘w’, 3);
Результат: ‘www’

Функция REVERSE переворачивает строку:

string REVERSE(str string)

Переставляет в строке str все символы с последнего на первый и возвращает результат. Поддерживает многобайтовые символы.

SELECT REVERSE (‘текст’);
Результат: ‘тскет’

Функция INSERT для вставки подстроки в строку:

string INSERT(str string, pos integer, len integer, newstr string)

Возвращает строку полученную в результате вставки в строку str подстроки newstr с позиции pos. Параметр len указывает сколько символов будет удалено из строки str, начиная с позиции pos. Поддерживает многобайтовые символы.

SELECT INSERT (‘text’, 2, 5, ‘MySQL’);
Результат: ‘tMySQL’
‘SELECT INSERT (‘text’, 2, 0, ‘MySQL’);
Результат: ‘tMySQLext’
SELECT INSERT (‘вставка текста’, 2, 7, ‘MySQL’);
Результат: ‘SELECT INSERT (‘вставка текста’, 2, 7, ‘MySQL’);’

Если вдруг понадобиться заеменить в тексте все заглавные буквы на прописные, то можно воспользоваться одной из двух функций:

string LCASE(str string) и string LOWER(str string)

Обе функции заменяют в строке str заглавные буквы на прописные и возвращают результат. И та и другая поддерживают многобайтовые символы.

SELCET LOWER (‘АБВГДеЖЗиКЛ’);
Результат:’абвгдежзикл’

Если же наоборот необходимо прописные буквы заменить заглавными, то также можно применить одну из двух функцийй:

string UCASE(str string) и string UPPER (str string)

Функции возвращают строку str, заменив все прописные символы на заглавные. Также поддерживают многобайтовые символы.
Пример:

SELECT UPPER (‘Абвгдежз’);
Результат: ‘АБВГДЕЖЗ’

Строковых функций в языке SQL немного больше, чем рассмотрено в данной статье. Но так как даже большинство рассмотренных здесь функций используются редко, я закончу их рассмотрение. В следующих статьях я постараюсь рассмотреть реальные практические примеры использования строковых функций SQL. Поэтому не забудьте подписаться на обновления блога. До новых встреч!

SQL — урок 2

В этой теме 0 ответов, 1 участник, последнее обновление Васильев Владимир Сергеевич 1 год назад.

Литералы

Литералы служат для непосредственного представления данных, ниже приведен список
стандартных литерал:

  • целочисленные — 0, -34, 45;
  • вещественные — 0.0, -3.14, 3.23e-23;
  • строковые — ‘текст’, n’текст’, ‘don»t!’;
  • дата — DATE ‘2008-01-10’;
  • время — TIME ’15:12:56′;
  • временная отметка — TIMESTAMP ‘2008-02-14 13:32:02’;
  • логический тип — true, false;
  • пустое значение — null.

Двойной апостроф интерпретируется в строковой литерале как апостроф в тексте.

В MySQL для временных литерал строка должна быть заключена в скобки: DATE (‘2008-01-10’).

Формат даты по умолчанию обычно определяется настройкой БД. Продвинутые СУБД могут
автоматически определять некоторые форматы (DATE (‘2008.01.10’))
или как в Oracle имеют функцию преобразования (to_date(‘01.02.2003′,’dd.mm.yyyy’)).
Для упрощения во многих СУБД там, где подразумевается дата,
перед строкой необязательно ставить имя типа.

Интервал времени

Синтаксис и реализация интервалов отличается на разных СУБД.

Oracle

Данный тип разделен на два: интервал по годам и интервал по дням.
В первом случае можно указать точность интервала только до месяца (по умолчанию год).
Во втором случае до различных долей секунды. Кроме этого указывается точность значения
временных промежутков в количестве цифр. Если точность не совпадает, то выводится сообщение
об ошибке.


PostgreSQL

интервалы указываются в виде строки, в которой перечисляются значение и тип промежутка:

  • microsecond — микросекунды;
  • millisecond — милисекунды;
  • second — секунды;
  • minute — минуты;
  • hour — часы;
  • day — дни;
  • week — недели;
  • month — месяцы;
  • year — года;
  • century — век;
  • millennium — тысячелетие.

Слова можно употреблять и во множественном числе.
Если интервал начинается с дней, то можно использовать короткий формат строки как
в Oracle для дневных интервалов.

MySQL

Только сложные интервалы, состоящие из более одного типа промежутков, указываются в строке.
Для этих целей введены дополнительные по сравнению с PostgreSQL имена для промежутков:

  • second_microsecond — секунды и микросекунды, формат строки ‘s.m’;
  • minute_microsecond — минуты и микросекунды, формат строки ‘m.m’;
  • minute_second — минуты и секунды, формат строки ‘m:s’;
  • hour_microsecond — часы и микросекунды, формат строки ‘h.m’;
  • hour_second — часы, минуты и секунды, формат строки ‘h:m:s’;
  • hour_minute — часы и минуты, формат строки ‘h:m’;
  • day_microsecond — день и микросекунды, формат строки ‘d.m’;
  • day_second — дни, часы, минуты и секунды, формат строки ‘d h:m:s’;
  • day_minute — дни, часы и минуты, формат строки ‘d h:m’;
  • day_hour — дни и часы, формат строки ‘d h’;
  • year_month — года и месяцы, формат строки ‘y-m’.

MySQL интервалы используются в выражениях с временными типами данных,
использовать их в качестве конечного типа для столбцов запрещено.

Выражения и операции

Для построения выражений SQL включает стандартные операции, ряд дополнительных предикатов
(булевских конструкций) и функций. В MySQL для встроенных функций между именем и открывающей
скобкой не должно быть пробелов, иначе будет сообщение об отсутствии подобной функции в БД.
Oracle не поддерживает логические выражения в перечислении select.

cтроковые операции

|| — соединение строк, в некоторых СУБД операнды автоматически преобразуются в
строковый тип. В MS Access используется &

алгебраические операции

  • + — сложение;
  • — вычитание;
  • * — умножение;
  • / — деление;
  • mod — остаток от деления. Oracle: mod(6,2). MySql: 6 mod 2.

Операции + и — также используются при работе со временем и интервалами.
В Oracle и PostgreSQL возможна разница между датами.
Результат возвращается в виде интервала в днях. Ниже приведен пример добавления к дате
интервала.

Ко времени можно прибавлять целое число, но результат зависит от конкретной СУБД.

операции отношения

  • — больше;
  • >= — больше либо равно;
  • = — равно;
  • <>,!= — не равно;

логические операции и предикаты

  • and — логическое и;
  • or — логическое или;
  • nor — отрицание;
  • between — определяет, находится ли значение в указанном диапазоне:

выражение BETWEEN значение_с AND значение_по
exists — определяет есть ли в указанной выборке хотя бы одна запись

EXISTS (select . )
Для скорости в подзапросе обычно выбирают константу, а не поля записей, так
как в данном случае нам важны не данные, а факт существования записей;
in — определяет, входит ли указанное значение в указанное множество:

выражение IN (значение1. значениеn)

В качестве множества значений может служить корректная выборка

выражение IN (select . )
is null — является ли указанное выражение NULL значением:

выражение IS NULL
like — определяет, удовлетворяет ли строка указанному шаблону:

строковое_выражение LIKE шаблон [ESCAPE еск_символ]
Знак % в шаблоне интерпретируется как строка любой длины, знак _
как любой символ. В конструкции ESCAPE еск_символ указывается символ ESCAPE
последовательности, который отменит обычную интерпретацию символов ‘_’ и ‘%’.
В последних стандартах включены предикаты SIMILAR и LIKE_REGEX расширяющие возможности
LIKE, используя в качестве шаблона регулярные выражения.

условные выражения

  • case — условный оператор, имеющий следующий синтаксис:
  • decode(expr,s1,r1[,sn,rn][,defr]) — сравнивает выражение expr с каждым выражением si
    из списка. Если выражения равны то возвращается значение равное ri. Если ни одно
    из выражений в списке не равно expr, то возвращается defr или NULL, если defr не было указано.
    Эта функция доступна только в Oracle и в большинстве случае заменяет оператор CASE;
  • coalesce(arg1,…,argn) — возвращает первый аргумент в списке не равный null. Для двух
    аргументов в Oracle можно воспользоваться функцией nvl;
  • greatest(arg1,…,argn) — возвращает наибольший аргумент в списке;
  • least(arg1,…,argn) — возвращает наименьший аргумент в списке;
  • nullif((arg1,arg2) — возвращает null если два аргумента равны, иначе первый
    аргумент.

Ниже приведен пример использования выражения в запросе выбора данных.

прочие операции

В каждой СУБД свой набор операций, выше были приведены наиболее употребительные.
Например, в PosgreSQL можно использовать и такие операции:

  • ^ — возведение в степень;
  • |/ — квадратный корень;
  • ||/ — кубический корень;
  • ! — постфиксный факториал;
  • !! — префиксный факториал;
  • @ — абсолютное значение.

Обзор функций

В арсенале каждой СУБД обязательно имеется набор встроенных функций для
обработки стандартных типов данных. В MySQL для встроенных функций между именем и
открывающей скобкой не должно быть пробелов, иначе будет сообщение об отсутствии подобной
функции в БД. В некоторых СУБД, как Oracle, если функция не имеет аргументов,
то скобки можно опустить.

математические функции

  • abs(x) — абсолютное значение;
  • ceil(x) — наименьшее целое, которое не меньше аргумента;
  • exp(x) — экспонента;
  • floor(x) — наибольшее целое, которое не больше аргумента;
  • ln(x) — натуральный логарифм;
  • power(x, y) — возводит x в степень y;
  • round(x [,y]) — округление x до y разрядов справа от десятичной точки. По умолчанию
    y равно 0;
  • sign(x) — возвращает -1 для отрицательных значений x и 1 для положительных;
  • sqrt(x) — квадратный корень;
  • trunc(x [,y]) — усекает x до у десятичных разрядов. Если у равно 0
    (значение по умолчанию), то х усекается до целого числа. Если у меньше 0, от отбрасываются
    цифры слева от десятичной точки.

Тригонометрические функции работают с радианами:

строковые функции

  • ascii(string) — возвращает код первого символа, эта функция обратна функции CHR;
  • chr(x) — возвращает символ с номером х, в MySQL это функция char;
  • length(string) — возвращает длину строки;
  • lower(string) — понижает регистр букв;
  • upper(string) — повышает регистр букв;
  • ltrim(string1[, string2]) — удаляет слева из первой строки все символы
    встречающиеся во второй строке. Если вторая строка отсутствует, то удаляются пробелы. В MySQL
    второй аргумент не поддерживается;
  • rtrim(string1[, string2]) — аналогична функции ltrim, только удаление
    происходит справа;
  • trim(string) — удаляет пробелы с обоих концов строки;
  • lpad(string1, n[, string2]) — дополняет первую строку слева n символами из
    второй строки, при необходимости вторая строка дублируется. Если string2 не указана, то
    используется пробел;
  • rpad(string1, n[, string2]) — аналогична функции lpad, только присоединение
    происходит справа;
  • replace(string1, c1, c2) — заменяет все вхождения символа/подстроки c1 на c2.
    Для простого удаления всех вхождений c1, в качестве третьего аргумента надо указать пустую
    строку (»). В Oracle третий аргумент не обязателен, и по умолчанию равен пустой строке;
  • instr(string1, string2[, a][, b]) — возвращает b вхождение строки string2
    в строке string1 начиная с позиции a. Если a отрицательно, то поиск происходит справа. По
    умолчанию a и b присваиваются значение 1. В MySQL последние два аргумента не поддерживаются. В
    PostgreSQL данной функции нет, однако ее реализация дана в документации, как раз для
    совместимости с Oracle;
  • substr(string, pos, len) — возвращает подстрку с позиции pos и длины len.

работа с датами

В рассматриваемых СУБД для обработки времени мало общего. Самый минимум у Oraсle:

  • current_date — глобальная переменная содержащая текущую дату. Можно использовать и в других СУБД;
  • trunc(d,s) — приводит дату к началу указанной временной отметки, например к началу месяца.
    В PostgreSQL есть аналогичная функция date_trunc(s,d). В MySQL для этих целей может
    использоваться функция date_format(d,s), но она возвращает результат в виде строки;
  • add_months(d,n) — добавляет к дате указанное число месяцев;
  • last_day(d) — последний день месяца, содержащегося в аргументе;
  • months_between(d1,d2) — возвращает число месяцев между датами.

Ниже приведены допустимые форматы в строковом параметре s для функций trunc и date_trunc соответственно:

  • квартал — q, quarter;
  • год — yyyy, year;
  • месяц — mm, month;
  • неделя — ww, week;
  • день — dd, day;
  • час — hh, hour;
  • минута — mi, minute.

Такие функции как last_day в других СУБД реализуются с помощью арифметики времени и преобразования типов.
Так что при желании можно написать соответствующую функцию. Ниже приведена выборка последнего дня указанной даты.

Преобразование типов

Множество типов разрешенные для преобразования в констркуции CAST AS определяется
реализацией СУБД. Так в MySQL может преобразовать только следующие типы: binary[(n)],
char[(n)], date, datetime, decimal[(m[,d])], signed [integer], time, unsigned [integer].
А в Oracle, кроме преобразования встроенных типов, можно преобразовывать выборки со
множеством записей в массивы.

В PostgreSQL более расширенные возможности по преобразованию. Во-первых, можно добавить
собственное преобразование для встроенных и пользовательских типов. Во-вторых, есть
собственный более удобный оператор преобразования типов .

В большинстве случае необходимо преобразование в строку либо из строки. Для этого случаяСУБД предоставляют дополнительные функции.

функции Oracle

  • to_char(date [,format[,nlsparams]]) — дату в строку;
  • to_char(number [,format[,nlsparams]]) — число в строку;
  • to_date(string[,format[,nlsparams]]) — строку в дату;
  • to_number( string [ ,format[, nlsparams] ]) — строку в число;
  • to_timestamp(string, format) — строку во время.

В этих функциях format описание формата даты или числа, а nlsparams — национальные
параметры. Формат строки для даты задается следующими элементами:

  • «» — вставляет указанный в ковычках текст;
  • AD, A.D. — вставляет AD с точками или без точек;
  • ВС, B.C. — вставляет ВС с точками или без точек;
  • СС, SCC — вставляет век, SCC возвращает даты ВС как отрицательные числа;
  • D — вставляет день недели;
  • DAY — вставляет имя дня, дополненное пробелами до длины в девять символов;
  • DD — вставляет день месяца;
  • DDD — вставляет день года;
  • DY1 — вставляет сокращенное название дня;
  • FF2 — вставляет доли секунд вне зависимости от системы счисления;
  • НН, НН12 — вставляет час дня (от 1 до 12);
  • НН24 — вставляет час дня (от 0 до 23);
  • MI — вставляет минуты;
  • MM — вставляет номер месяца;
  • MOMn — вставляет сокращенное название месяца;
  • MONTHn — вставляет название месяца, дополненное пробелами до девяти символов;
  • RM — вставляет месяц римскими цифрами;
  • RR — вставляет две последние цифры года;
  • RRRR — вставляет весь год;
  • SS — вставляет секунды;
  • SSSSS — вставляет число секунд с полуночи;
  • WW — вставляет номер недели года (неделя — 7 дней от первого числа, а не от понедельника до воскресенья);
  • W — вставляет номер недели месяца;
  • Y.YYY — вставляет год с запятой в указанной позиции;
  • YEAR, SYEAR — вставляет год, SYEAR возвращает даты ВС как отрицательные числа;
  • YYYY, SYYYY — вставляет год из четырех цифр, SYYYY возвращает даты ВС как отрицательные числа;
  • YYY, YY, Y — вставляет соответствующее число последних цифр года.

Формат числовой строки задается следующими элементами:

  • $ — вставляет знак доллара перед числом;
  • В — вставляет пробелы для целой части десятичного числа, если она равна нулю;
  • MI — вставляет знак минус в конце (например, ‘999.999mi’);
  • S — вставляет знак числа в начале или в конце (например,’s9999′ или ‘9999s’);
  • PR — записывает отрицательное число в уголвых скобках (например,’999.999pr’);
  • D — вставляет разделитель десятичной точки в указанной позиции (например, ‘999D999’);
  • G — вставляет групповой разделитель в указанной позиции (например,’9G999G999′). При этом дробная часть числа отбрасывается;
  • С — вставляет ISO идентификатор валюты в начале или в конце числа (например, ‘с9999’ или ‘9999с’);
  • L — вставляет локальный символ валюты в в начале или в конце числа (например, ‘l9999’ или ‘9999l’);
  • , — вставляет запятую в указанной позиции вне зависимости от группового разделителя;
  • . — вставляет десятичную точку в указанной позиции вне зависимости от разделителя десятичной точки;
  • V — возвращает значение, умноженное на 10^n, где n равно числу девяток после V. В случае необходимости это значение округляется;
  • ЕЕЕЕ — 9.99ЕЕЕЕ возвращает значение в экспоненциальной форме записи;
  • RM — RM значение будет записано римскими цифрами в верхнем регистре;
  • rm — rm значение будет записано римскими цифрами в нижнем регистре;
  • — вставляет нули, вместо пробелов в начале строки или в конце, например,
    9990 вставляет нули, вместо пробелов в конце строки;
  • 9 — каждая 9 определяет значащую цифру.

функции PostgreSQL

  • to_char(timestamp, format) — время в строку;
  • to_char(interval, format) — интервал времени в строку;
  • to_char(number, format) — число в строку;
  • to_date(str, format) — строку в дату;
  • to_number(str, format) — строку в число;
  • to_timestamp(str, format) — строку во время.

Основные элементы форматирования совпадают с Oracle.

функции MySQL

  • date_format(date,format) — дату в строку;
  • time_format(time,format) — время в строку;
  • format(number,precision) — число в cтроку типа ‘#,###,###.##’,
    где число знаков определяется вторым аргументом.

Ниже приведен список основных элементов форматирования для даты и времени:

  • %c — месяц числом;
  • %d — день месяца;
  • %H — часы (от 0 до 24);
  • %h — часы (1 до 12);
  • %i — минуты;
  • %s — секунды;
  • %T — время в формате «hh:mm:ss»;
  • %Y — год, четыре цифры;
  • %y — год, две цифры.

Функции работы со строками в MS SQL SERVER 2005

Вот полный перечень функций работы со строками, взятый из BOL:

ASCII NCHAR SOUNDEX
CHAR PATINDEX SPACE
CHARINDEX REPLACE STR
DIFFERENCE QUOTENAME STUFF
LEFT REPLICATE SUBSTRING
LEN REVERSE UNICODE
LOWER RIGHT UPPER
LTRIM RTRIM

Начнем с двух взаимно обратных функций — ASCII и CHAR.

Функция ASCII возвращает ASCII-код крайнего левого символа строкового выражения, являющегося аргументом функции.

Вот, например, как можно определить, сколько имеется разных букв, с которых начинаются названия кораблей в таблице Ships:

SELECT COUNT(DISTINCT ASCII(name)) FROM Ships

Результат — 11. Чтобы выяснить, какие это буквы, мы можем применить функцию CHAR, которая возвращает символ по известному ASCII-коду (от 0 до 255):

SELECT DISTINCT CHAR(ASCII(name)) FROM Ships ORDER BY 1

Следует отметить, что аналогичный результат можно получить проще с помощью еще одной функции — LEFT, которая имеет следующий синтаксис:

и вырезает заданное вторым аргументом число символов слева из строки, являющейся первым аргументом. Итак,

SELECT DISTINCT LEFT(name, 1) FROM Ships ORDER BY 1

А вот как, например, можно получить таблицу кодов всех алфавитных символов:

SELECT CHAR(ASCII(‘a’)+ num-1) letter, ASCII(‘a’)+ num — 1 [code]
FROM (SELECT 5*5*(a-1)+5*(b-1) + c AS num
FROM (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
CROSS JOIN
(SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) y
CROSS JOIN
(SELECT 1 c UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) z
) x
WHERE ASCII(‘a’)+ num -1 BETWEEN ASCII(‘a’) AND ASCII(‘z’)

Тех, кто еще не в курсе генерации числовой последовательности, отсылаю к соответствующей статье .

Как известно, коды строчных и прописных букв отличаются. Поэтому чтобы получить полный набор без переписывания запроса, достаточно просто дописать к вышеприведенному коду аналогичный:

UNION
SELECT CHAR(ASCII(‘A’)+ num-1) letter, ASCII(‘A’)+ num — 1 [code]
FROM (SELECT 5*5*(a-1)+5*(b-1) + c AS num
FROM (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
CROSS JOIN
(SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) y
CROSS JOIN
(SELECT 1 c UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) z
) x
WHERE ASCII(‘A’)+ num -1 BETWEEN ASCII(‘A’) AND ASCII(‘Z’)

Чтобы таблица выглядела более патриотично, достаточно заменить латинские буквы «a» и «A» на неотличимые на взгляд русские — «а» и «А», а «z» и «Z» на «я» и «Я». Вот только буквы «ё» вы не увидите в этой таблице, т.к. в кодовой таблице ASCII эти символы лежат отдельно, что легко проверить:

SELECT ASCII(‘ё’) UNION ALL SELECT ASCII(‘Ё’)

Я полагаю, что не будет сложным добавить эту букву в таблицу, если потребуется.

Рассмотрим теперь задачу определения нахождения искомой подстроки в строковом выражении. Для этого могут использоваться две функции — CHARINDEX и PATINDEX. Обе они возвращают начальную позицию (позицию первого символа подстроки) подстроки в строке. Функция CHARINDEX имеет синтаксис:

CHARINDEX (искомое_выражение, строковое_выражение[, стартовая_позиция])

Здесь необязательный целочисленный параметр стартовая_позиция определяет позицию в строковом выражении, начиная с которой выполняется поиск искомого_выражения . Если этот параметр опущен, поиск выполняется от начала строкового_выражения. Например, запрос

SELECT name FROM Ships WHERE CHARINDEX(‘sh’, name) > 0

будет выводить те корабли, в которых имеется сочетание символов «sh». Здесь используется тот факт, что если искомая строка не будет обнаружена, то функция CHARINDEX возвращает 0. Результат выполнения запроса будет содержать следующие корабли:

name
Kirishima
Musashi
Washington

Следует отметить, что если искомая подстрока либо строковое выражение есть NULL, то результатом функции тоже будет NULL.

Следующий пример определяет позиции первого и второго вхождения символа «a» в имени корабля «California»

SELECT CHARINDEX(‘a’,name) first_a,
CHARINDEX(‘a’, name, CHARINDEX(‘a’, name)+1) second_a
FROM Ships WHERE name=’California’

Обратите внимание, что при определении второго символа в функции используется стартовая позиция, которой является позиция следующего за первой буквой «a» символа — CHARINDEX(‘a’, name)+1. Правильность результата — 2 и 10 — легко проверить :-).

Функция PATINDEX имеет синтаксис:

PATINDEX (‘%образец%’ , строковое_выражение)

Главное отличие этой функции от CHARINDEX заключается в том, что поисковая строка может содержать подстановочные знаки — % и _. При этом концевые знаки «%» являются обязательными. Например, использование этой функции в первом примере будет иметь вид

SELECT name FROM Ships WHERE PATINDEX(‘%sh%’, name) > 0

А вот, например, как можно найти имена кораблей, которые содержат последовательность из трех символов, первый и последний из которых есть «e»:

SELECT name FROM Ships WHERE PATINDEX(‘%e_e%’, name) >0

Результат выполнения этого запроса выглядит следующим образом:

name
Revenge
Royal Sovereign

Парная к LEFT функция RIGHT возвращает заданное число символов справа из строкового выражения:

Вот, например, как можно определить имена кораблей, которые начинаются и заканчиваются на одну и ту же букву:

SELECT name FROM Ships WHERE LEFT(name, 1) = RIGHT(name, 1)

То, что в результате мы получим пустой результирующий набор, означает, что таких кораблей в базе данных нет. Давайте возьмем комбинацию значений — класс и имя корабля.

Соединение двух строковых значений в одно называется конкатенацией, и в SQL Server для этой операции используется знак «+» (в стандарте «||»). Итак,

SELECT * FROM (
SELECT class +’ ‘+ name AS cn FROM Ships
) x
WHERE LEFT(cn, 1)=RIGHT(cn, 1)

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

cn
Iowa Missouri
North Carolina Washington

А если строковое выражение будет содержать лишь одну букву? Запрос выведет ее. В этом легко убедиться, написав

SELECT * FROM (
SELECT class +’ ‘+ name AS cn FROM Ships
UNION ALL
SELECT ‘a’ as nc
) x
WHERE LEFT(cn, 1)=RIGHT(cn, 1)

Чтобы исключить этот случай, можно воспользоваться еще одной полезной функцией LEN ( ), которая возвращает число символов в строке. Ограничимся случаем, когда число символов больше единицы:

SELECT * FROM (
SELECT class +’ ‘+ name AS cn FROM Ships
UNION ALL
SELECT ‘a’ as nc
) x
WHERE LEFT(cn, 1)=RIGHT(cn, 1) AND LEN(cn)>1

Замечание. Реализация этой функции в MS SQL Server имеет одну особенность, а именно, при подсчете длины не учитываются концевые пробелы.
Действительно, выполним следующий код:

DECLARE @chr AS CHAR(12), @vchr AS VARCHAR(12)

SELECT @chr = ‘abcde’ + REPLICATE(‘ ‘, 5), @vchr = ‘abcde’+REPLICATE(‘ ‘, 5)

SELECT LEN(@chr), LEN(@vchr)
SELECT DATALENGTH(@chr), DATALENGTH(@vchr)

5 5
12 10

Функция REPLICATE дополняет константу ‘abcde’ пятью пробелами справа, которые не учитываются функцией LEN, — в обоих случаях получаем 5.
Функция DATALENGTH возвращает число байтов в представлении переменной и демонстрирует нам различие между типами CHAR и VARCHAR. DATALENGTH даст нам 12 для типа CHAR и 10 — для VARCHAR.
Как и следовало ожидать, DATALENGTH для переменной типа VARCHAR вернула фактическую длину переменной. Но почему для переменной типа CHAR результат оказался равным 12? Дело в том, что CHAR — это тип фиксированной длины. Если значение переменной оказывается меньше ее длины, а длину мы объявили как CHAR(12), то значение переменной будет «выровнено» до требуемой длины за счет добавления концевых пробелов.

На сайте имеются задачи, в которых требуется упорядочить (найти максимум и т.д.) в числовом порядке значения, представленные в текстовом формате. Например, номер места в самолете («2d») или скорость CD («24x»). Проблема заключается в том, что текст сортируется так (по возрастанию)

11a
1a
2a

SELECT ‘1a’ AS place
UNION ALL SELECT ‘2a’
UNION ALL SELECT ’11a’
ORDER BY 1

Если же требуется упорядочить места в порядке возрастания рядов, то порядок должен быть такой

1a
2a
11a

Чтобы добиться такого порядка, нужно выполнить сортировку по числовым значениям, присутствующим в тексте. Можно предложить такой алгоритм:
1. Извлечь число из строки.
2. Привести его к числовому формату.
3. Выполнить сортировку по приведенному значению.

Т.к. нам известно, что буква только одна, то для извлечения числа из строки можно воспользоваться следующей конструкцией, которая не зависит от числа цифр в номере места:

LEFT(place, LEN(place)-1)

Если только этим и ограничиться, то получим

place
1a
11a
2a

Приведение к числовому формату может быть следующим:

CAST (LEFT(place, LEN(place)-1) AS INT)

Осталось выполнить сортировку

SELECT * FROM (
SELECT ‘1a’ AS place
UNION ALL SELECT ‘2a’
UNION ALL SELECT ’11a’
) x
ORDER BY CAST(LEFT(place, LEN(place)-1) AS INT)

Что и требовалось доказать.

Ранее мы для извлечения числа из текстовой строки пользовались функцией LEFT, т.к. нам было известно априори, какое число символов нужно убрать справа (один). А если же нужно извлечь строку из подстроки не по известной позиции символа, а по самому символу? Например: извлечь все символы до первой буквы «х» (значение скорости CD).

В этом случае мы можем использовать также уже рассмотренную ранее функцию CHARINDEX, которая позволит определить неизвестную позицию символа:

SELECT model, LEFT(cd, CHARINDEX(‘x’, cd) -1) FROM PC

Функция SUBSTRING

Эта функция позволяет извлечь из выражения его часть заданной длины, начиная от заданной начальной позиции. Выражение может быть символьной или бинарной строкой, а также иметь тип text или image. Например, если нам потребуется получить 3 символа в названии корабля, начиная со 2-го символа, то сделать без помощи функции SUBSTRING будет не так просто. А так мы пишем:

SELECT name, SUBSTRING(name, 2, 3) FROM Ships

В случае, когда нужно извлечь все символы, начиная с некоторого, мы также можем использовать эту функцию. Например,

SELECT name, SUBSTRING(name, 2, LEN(name)) FROM Ships

даст нам все символы в названиях кораблей от второй буквы в имени. Обратите внимание на то, что для указания числа извлекаемых символов я использовал функцию LEN(name), которая возвращает число символов в имени. Понятно, что поскольку мне нужны символы, начиная со второго, то их число будет меньше общего количества символов в имени. Однако это не вызывает ошибки, поскольку если указанное число символов превышает возможное число, то будут извлечены все символы до конца строки. Поэтому я и беру их с запасом, не утруждая себя вычислениями.

Функция REVERSE

Эта функция переворачивает строку, как бы читая ее справа налево. Т.е. результатом запроса

SELECT REVERSE(‘abcdef’)

будет ‘fedcba’. Если бы в языке отсутствовала функция RIGHT, то запрос

SELECT RIGHT(‘abcdef’,3)

можно было бы равносильно заменить запросом

SELECT REVERSE(LEFT(REVERSE(‘abcdef’),3))

Я вижу пользу этой функции в следующем. Пусть нам требуется определить позицию не первого, а последнего вхождения некоторого символа (или последовательности символов) в строке. Вспомним пример, в котором мы определяли позицию первого символа «а» в названии корабля «California»:

SELECT CHARINDEX(‘a’, name) first_a
FROM Ships WHERE name=’California’

Определим теперь позицию последнего вхождения в это название символа «а». Функция

CHARINDEX(‘a’, REVERSE(name))

позволит найти эту позицию, но справа. Для получения позиции этого же символа слева достаточно написать

SELECT LEN(name) + 1 — CHARINDEX(‘a’, REVERSE(name)) first_a
FROM Ships WHERE name=’California’

Функция REPLACE

Заменяет в строке1 все вхождения строки2 на строку3. Эта функция, безусловно, полезна в операторах обновления (UPDATE), если нужно изменить (исправить) содержимое столбца. Пусть, например, нужно заменить все пробелы дефисом в названиях кораблей. Тогда можно написать

UPDATE Ships
SET name = REPLACE(name, ‘ ‘, ‘-‘)

(Этот пример можно выполнить на странице с упражнениями DML, где разрешаются запросы на изменение данных)

Однако эта функция может найти применение и в более нетривиальных случаях. Давайте определим, сколько раз в названии корабля используется буква «a». Идея проста: заменим каждую искомую букву двумя любыми символами, после чего посчитаем разность длин полученной и искомой строки. Итак,

SELECT name, LEN(REPLACE(name, ‘a’, ‘aa’)) — LEN(name) FROM Ships

А если нам нужно определить число вхождений произвольной последовательности символов, скажем, передаваемой в качестве параметра в хранимую процедуру? Использованный выше алгоритм в этом случае следует дополнить делением на число символов в искомой последовательности:

DECLARE @str AS VARCHAR(100)
SET @str=’ma’
SELECT name, (LEN(REPLACE(name, @str, @str + @str)) — LEN(name))/LEN(@str) FROM Ships

Для удвоения числа искомых символов здесь применялась конкатенация — @str + @str . Однако для этой цели можно использовать еще одну функцию — REPLICATE, которая повторяет первый аргумент такое число раз, которое задается вторым аргументом.

SELECT name, (LEN(REPLACE(name, @str, REPLICATE(@str, 2))) — LEN(name))/LEN(@str) FROM Ships

Т.е. мы повторяем дважды подстроку, хранящуюся в переменной @str .

Если же нужно заменить в строке не определенную последовательность символов, а заданное число символов, начиная с некоторой позиции, то проще использовать функцию STUFF:

Эта функция заменяет подстроку длиной L, которая начинается со стартовой позиции в строке1, на строку2.

Пример. Изменить имя корабля: оставив в его имени 5 первых символов, дописать «_» (нижнее подчеркивание) и год спуска на воду. Если в имени менее 5 символов, дополнить его пробелами.

Можно решать эту задачу с помощью разных функций. Мы же попытаемся это сделать с помощью функции STUFF. В первом приближении напишем (ограничимся запросом на выборку):

SELECT name, STUFF(name, 6, LEN(name), ‘_’+launched) FROM Ships

Третьим аргументом (количество символов для замены) я использую LEN(name), т.к. мне нужно заменить все символы до конца строки, поэтому я беру с запасом — исходное число символов в имени. И все же этот запрос вернет ошибку. Причем дело не в третьем аргументе, а в четвертом, где выполняется конкатенация строковой константы и числового столбца. Ошибка приведения типа. Для преобразования числа к его строковому представлению можно воспользоваться еще одной встроенной функцией — STR:

При этом преобразовании выполняется округление, а длина задает длину результирующей строки. Например,

STR(3.3456, 5, 1) 3.3
STR(3.3456, 5, 2) 3.35
STR(3.3456, 5, 3) 3.346
STR(3.3456, 5, 4) 3.346

Обратите внимание, что если полученное строковое представление числа меньше заданной длины, то добавляются лидирующие пробелы. Если же результат больше заданной длины, то усекается дробная часть (с округлением); в случае же целого числа получаем соответствующее число звездочек «*»:

STR(12345,4,0) ****

Кстати, по умолчанию используется длина в 10 символов. Имея в виду, что год представлен четырьмя цифрами, напишем

SELECT name, STUFF(name, 6, LEN(name), ‘_’+STR(launched, 4)) FROM Ships

Уже почти все правильно. Осталось учесть случай, когда число символов в имени менее 6, т.к. в этом случае функция STUFF дает NULL. Ну что ж вытерпим до конца мучения, связанные с использованием этой функции в данном примере, попутно применив еще одну строковую функцию. Добавим конечные пробелы, чтобы длина имени была заведомо больше 6. Для этого имеется специальная функция SPACE

SELECT name, STUFF(name + SPACE(6), 6, LEN(name), ‘_’+STR(launched,4)) FROM Ships

Функции LTRIM и RTRIM

отсекают соответственно лидирующие и конечные пробелы строкового выражения, которое неявно приводится к типу VARCHAR.

Пусть требуется построить такую строку: имя пассажира_идентификатор пассажира для каждой записи из таблицы Passenger. Если мы напишем

SELECT name + ‘_’ + CAST(id_psg AS VARCHAR) FROM Passenger,

то в результате получим что-то типа:

Это связано с тем, что столбец name имеет тип CHAR(30). Для этого типа короткая строка дополняется пробелами до заданного размера (у нас 30 символов). Здесь нам как раз и поможет функция RTRIM:

SELECT RTRIM(name) + ‘_’ + CAST(id_psg AS VARCHAR) FROM Passenger

Функции LOWER и UPPER

преобразуют все символы аргумента соответственно к нижнему и верхнему регистру. Эти функции оказываются полезными при сравнении регистрозависимых строк.

Пара интересных функций SOUNDEX и DIFFERENCE:

Позволяют определить близость звучания слов. При этом SOUNDEX возвращает четырехсимвольный код, используемый для сравнения, а DIFFERENCE собственно и оценивает близость звучания двух сравниваемых строковых выражений. Поскольку эти функции не поддерживают кириллицы, отсылаю интересующихся к BOL за примерами их использования.

В заключение приведем функции и несколько примеров использования юникода.

Функция UNICODE

возвращает юникод первого символа строкового выражения.

Функция NCHAR

возвращает символ по его юникоду. Несколько примеров.

SELECT ASCII(‘а’), UNICODE(‘а’)


возвращает код ASCII и юникод русской буквы «а»: 224 и 1072.

SELECT CHAR(ASCII(‘а’)), CHAR(UNICODE(‘а’))

Пытаемся восстановить символ по его коду. Получаем «а» и NULL. NULL-значение возвращается потому, что кода 1072 нет в обычной кодовой таблице.

SELECT CHAR(ASCII(‘а’)), NCHAR(UNICODE(‘а’))

Теперь все нормально, в обоих случаях «а». Наконец,

SELECT NCHAR(ASCII(‘а’))

даст «a», т.к. юникод 224 соответствует именно этой букве.

Приведенные здесь примеры можно выполнить непосредственно на сайте, установив флажок «Без проверки» на странице с упражнениями на SELECT.

Символьные функции и аргументы типа CHAR в PL/SQL

Символьная функция получает в качестве параметра одно или несколько символьных значений и возвращает символьное и числовое значение. Если символьная функция возвращает символьное значение, оно всегда имеет тип VARCHAR2 (переменная длина) — кроме функций UPPER и LOWER . Эти функции преобразуют заданную строку к верхнему или нижнему регистру соответственно и возвращают значение фиксированной длины типа CHAR , если переданные в аргументах строки имели тип CHAR .

Краткая сводка строковых функций

Как упоминалось ранее, PL/SQL предоставляет в распоряжение программиста широкий набор мощных, высокоуровневых строковых функций для получения информации о строках и модификации их содержимого. Следующий список дает представление об их возможностях и синтаксисе. За полной информацией о конкретных функциях обращайтесь к справочнику Oracle SQL Reference.

  • ASCII(символ ) Возвращает числовой код (NUMBER) представления заданного символа в наборе символов базы данных.
  • ASCIISTR(строка1) Получает строку в любом наборе символов и преобразует ее в строку ASCII-символов. Все символы, отсутствующие в кодировке ASCII, представляются в форме \XXXX, где XXXX — код символа в Юникоде.

За информацией о Юникоде и кодах символов обращайтесь на сайт http://unicode.org.

  • CHR(код)
    Возвращает символ типа VARCHAR2 (длина 1), соответствующий заданному коду. Функция является обратной по отношению к функции ASCII. У нее имеется разновидность, удобная при работе с данными в национальных наборах символов:

Возвращает символ типа NVARCHAR2 из национального набора символов.

  • COMPOSE(строка1)
    Получает строку символов в формате Юникода и возвращает ее в нормализованном виде. Например, ненормализованное представление ‘a\0303’ определяет символ ‘ a ‘ с тильдой cверху (то есть a). Вызов COMPOSE(‘a\0303’) возвращает значение ‘ \00E3’ — шестнадцатеричный код символа a в Юникоде.

В Oracle9i Release 1 функция COMPOSE могла вызываться только из SQL-команд; в программах PL/SQL она использоваться не могла. Начиная с Oracle9i Release2, функция COMPOSE также может использоваться в выражениях PL/SQL.

  • CONCAT(строка1, строка2)
    Присоединяет строку2 в конец строки1. Аналогичного результата можно добиться при помощи выражения строка1 || строка2. Оператор || намного удобнее, поэтому функция CONCAT используется относительно редко.
  • CONVERT(строка1, набор_символов)
    Преобразует строку из набора символов базы данных в заданный набор символов. При вызове также можно задать исходный набор символов:

CONVERT(строка1, конечный_набор, исходный_набор)

    DECOMPOSE(строка1)
    Получает строку в Юникоде и возвращает строку, в которой все составные символы разложены на элементы. Функция является обратной по отношению к COMPOSE . Например, вызов DECOMPOSE (‘a’) возвращает строку ‘ a

‘ (см. описание COMPOSE ).

Существует две разновидности этой функции:

  • DECOMPOSE(строка1 CANONICAL)
    Выполняет каноническую декомпозицию; полученный результат может быть восстановлен вызовом COMPOSE . Используется по умолчанию.
  • DECOMPOSE(строка1)
    Декомпозиция выполняется в так называемом режиме совместимости. Восстановление вызовом COMPOSE может оказаться невозможным.

Функция DECOMPOSE , как и COMPOSE , не может напрямую вызываться в выражениях PL/SQL в Oracle9i Release 1; ее необходимо вызывать из инструкций SQL. Начиная с Oracle9i Release 2, это ограничение было снято.

  • GREATEST(строка1, строка2, . )
    Получает одну или несколько строк и возвращает строку, которая оказалась бы последней (то есть наибольшей) при сортировке входных строк по возрастанию. Также см. описание функции LEAST , обратной по отношению к GREATEST .
  • INITCAP(строка1)
    Изменяет регистр символов строкового аргумента, переводя первую букву каждого слова строки в верхний регистр, а остальные буквы — в нижний. Словом считается последовательность символов, отделенная от остальных символов пробелом или символом, не являющимся буквенно-цифровым (например, # или _) . Например, вызов INITCAP (‘ this is lower’) дает результат ‘This Is Lower’.
  • INSTR(строка1, строка2)
    Возвращает позицию, с которой строка2 входит в строку1; если вхождение не обнаружено, функция возвращает 0.

Существует несколько разновидностей этой функции:

  • INSTR(строка1, строка2, начальная_позиция)
    Поиск строки2 в строке1 начинается с позиции, заданной последним параметром. По умолчанию поиск начинается с позиции 1, так что вызов INSTR(string1, string2, 1 ) эквивалентен вызову INSTR(string1, string2) .
  • INSTR(строка1, строка2, отрицательная_начальная_позиция)
    Смещение начальной позиции задается не от начала, а от конца строки1.
  • INSTR(строка1, строка2, начальная_позиция, n )
    Находит n-е вхождение строки2, начиная с заданной начальной позиции.
  • INSTR(строка1, строка2, отрицательная_начальная_позиция, n)
    Находит n-е вхождение строки2, начиная с заданной начальной позиции от конца строки1.

Функция INSTR рассматривает строку как последовательность символов. Ее разновидности INSTRB, INSTR2 и INSTR4 рассматривают строку как последовательность байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность INSTRC рассматривает строку как последовательность полных символов Юникода. Например, строка ‘a\0303’ , которая представляет собой разложенный эквивалент ‘\00E3’, или a , рассматривается как один символ. Напротив, функция INSTR рассматривает ‘a\0303 ‘ как последовательность из двух символов.

  • LEAST(строка1, строка2, . )
    Получает одну или несколько строк и возвращает строку, которая оказалась бы первой (то есть наименьшей) при сортировке входных строк по возрастанию. Также см. описание функции GREATEST , обратной по отношению к LEAST .
  • LENGTH(строка1)
    Возвращает количество символов в строке. Разновидности LENGTHB, LENGTH2 и LENGTH4 возвращают количество байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность LENGTHC возвращает количество полных символов Юникода, нормализованных по мере возможности (то есть с преобразованием ‘a\0303 ‘ в ‘\00E3’ ).

Функция LENGTH обычно не возвращает нуль. Вспомните, что Oracle рассматривает пустую строку (») как NULL , поэтому вызов LENGTH (») фактически эквивалентен попытке получить длину NULL ; ее результат тоже будет равен NULL . Единственное исключение встречается при применении LENGTH к типу CLOB . Тип CLOB может содержать 0 байт и при этом быть отличным от NULL . В этом единственном случае LENGTH возвращает 0.

  • LOWER(строка1)
    Преобразует все буквы заданной строки в нижний регистр. Функция является обратной по отношению к UPPER . Тип возвращаемого значения соответствует типу входных данных ( CHAR ,VARCHAR2, CLOB ). Также см. NLS_LOWER .
  • LPAD(строка1, итоговая_длина)
    Возвращает значение строки1, дополненное слева пробелами до итоговой_длины . У функции существует следующая разновидность:
  • LPAD(строка1, итоговая_длина, заполнитель)
    Присоединяет достаточное количество полных или частичных вхождений заполнителя, чтобы общая длина строки достигла заданной итоговой_длины . Например, вызов LPAD ( ‘Merry Christmas!’, 25, ‘Ho! ‘) вернет результат ‘ Ho! Ho! HMerry Christmas!’.
  • ?LTRIM(строка1)
    Удаляет пробелы с левого края строки1. Также см. описания функций TRIM (стандарт ISO) и RTRIM . У функции существует следующая разновидность:
  • LTRIM(строка1, удаляемый_набор)
    Удаляет любые символы, входящие в строку удаляемый_набор , от левого края строки1.
  • NCHR(код)
    Возвращает символ типа NVARCHAR2 (длина 1) , соответствующий заданному коду. Функция CHR с условием USING NCHAR_CS реализует ту же функциональность, что и NCHR .
  • NLS_INITCAP (строка1)
    Возвращает версию строки1, которая должна относиться к типу NVARCHAR2 или NCHAR , в которой первая буква каждого слова переводится в верхний регистр, а остальные буквы — в нижний. Функция возвращает значение типа VARCHAR2 . «Словом» считается последовательность символов, отделенная от остальных символов пробелом или символом, не являющимся буквенно-цифровым.

Вы можете задать порядок сортировки, влияющий на определение «первой буквы»:

  • NLS_INITCAP(строка1, ‘NLS_SORT=правило_сортировки’)
    В этой форме синтаксиса правило_сортировки представляет собой одно из допустимых названий правил сортировки, перечисленных в руководстве Oracle Database Globalization Support Guide, Appendix A, раздел «Linguistic Sorts».

Следующий пример показывает, чем функция INITCAP отличается от NLS_INITCAP :

В нидерландском языке последовательность символов « ? » рассматривается как один символ. Функция NLS_INITCAP распознает это обстоятельство при задании правила NLS_SORT и правильно преобразует символы слова « ?zer » («железо» по-нидерландски).

  • NLS_LOWER(строка1) и NLS_LOWER(строка1, ‘NLS_SORT=правило_сортировки ‘) Возвращает строку1, преобразованную в нижний регистр по правилам заданного языка. О том, как NLS_SORT может повлиять на результат преобразования, рассказано в описании функции NLS_INITCAP .
  • NLS_UPPER(строка1) и NLS_UPPER(строка1, ‘NLS_SORT=правило_сортировки’) Возвращает строку1, преобразованную в верхний регистр по правилам заданного языка. О том, как NLS_SORT может повлиять на результат преобразования, рассказано в описании функции NLS_INITCAP .
  • NLSSORT(строка1) и NLSSORT(строка1, ‘NLS_SORT=правило_сортировки ‘) Возвращает строку байтов, которая может использоваться для сортировки строкового значения по правилам заданного языка. Строка возвращается в формате RAW . Например, сравнение двух строк по правилам французского языка выполняется так: IF NLSSORT(x, ‘NLS_SORT=XFRENCH’) > NLSSORT(y, ‘NLS_SORT=XFRENCH’) THEN. Если второй параметр не указан, функция использует порядок сортировки по умолчанию, назначенный для сеанса. Полный список правил приведен в руководстве Oracle Database Globalization Support Guide, Appendix A, раздел «Linguistic Sorts».
  • REGEXP_COUNT, REGEXP_INSTR, REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR За описаниями этих функций, предназначенных для работы с регулярными выражениями, можно изучить эту статью.
  • REPLACE(строка1, искомая_строка, замена) Возвращает строку, полученную в результате замены всех вхождений искомой_строки в строке1 строкой замена. Функция REPLACE может использоваться для замены всех вхождений определенной подстроки в одной инструкции.
  • REPLACE(строка1, искомая_строка)
    Возвращает строку, полученную в результате удаления всех вхождений искомой_строки из строки1.
  • RPAD(строка1, итоговая_длина)
    Возвращает значение строки1, дополненное справа пробелами до итоговой_длины . У функции существует следующая разновидность:
  • RPAD(строка1, итоговая_длина, заполнитель)
    Присоединяет достаточное количество полных или частичных вхождений заполнителя, чтобы общая длина строки достигла заданной итоговой_длины . Вызов RPAD(‘Merry Christmas!’, 25, ‘Ho! ‘) вернет результат ‘Merry Christmas! Ho! Ho!’.

Функция RPAD дополняет строку справа, а парная ей функция LPAD — слева.

  • RTRIM(строка1)
    Удаляет пробелы с правого края строки1. Также см. описания функций TRIM (стандарт ISO) и LTRIM . У функции существует следующая разновидность:
  • RTRIM(строка1, удаляемый_набор)
    Удаляет любые символы, входящие в строку удаляемый_набор , с правого края строки1.
  • SOUNDEX(строка1)
    Возвращает строку с «фонетическим представлением» аргумента.
    Пример:

При использовании функции SOUNDEX следует помнить несколько правил:

  • Значение SOUNDEX всегда начинается с первой буквы входной строки.
  • Возвращаемое значение генерируется только по первым пяти согласным в строке.
  • Для вычисления цифровой части SOUNDEX используются только согласные. Все гласные в строке, кроме начальных, игнорируются.
  • Функция SOUNDEX игнорирует регистр символов; для букв верхнего и нижнего регистра генерируются одинаковые значения SOUNDEX .

Функция SOUNDEX полезна для запросов, при которых точное написание значения в базе данных неизвестно или не может быть легко определенно.

Алгоритм SOUNDEX ориентирован на английский язык; в других языках он может работать плохо (или не работать вообще).

  • SUBSTR(строка1, начальная_позиция, длина)
    Возвращает подстроку из строки1, которая начинается с начальной_позиции и имеет заданную длину. Если количество символов до конца строки1 окажется меньше длины, возвращаются все символы от начальной позиции до конца строки. У функции существуют следующие разновидности:
  • SUBSTR(строка1, начальная_позиция)
    Возвращает все символы от начальной_позиции до конца строки1.
  • SUBSTR(строка1, отрицательная_начальная_позиция, длина)
    Начальная позиция подстроки отсчитывается от конца строки1.
  • SUBSTR(строка1, отрицательная_начальная_позиция)
    Возвращает последние ABS( отрицательная_начальная_позиция ) строки.

Функция SUBSTR рассматривает строку как последовательность символов. Ее разновидности SUBSTRB, SUBSTR2 и SUBSTR4 рассматривают строку как последовательность байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность SUBSTRC рассматривает строку как последовательность полных символов Юникода. Например, строка ‘a\0303’ , которая представляет собой разложенный эквивалент ‘\00E3’ , или a , рассматривается как один символ. Напротив, функция SUBSTR рассматривает ‘a\0303’ как последовательность из двух символов.

  • TO_CHAR(национальные_символьные_данные)
    Преобразует данные из национального набора символов в эквивалентное представление в наборе символов базы данных. Также см. TO_NCHAR .

Функция TO_CHAR также может использоваться для преобразования даты/ времени и чисел в удобочитаемую форму.

  • TO_MULTI_BYTE(строка1)
    Преобразует однобайтовые символы в их многобайтовые эквиваленты. В некоторых многобайтовых кодировках, и прежде всего UTF-8, может существовать несколько вариантов представления одного символа. Скажем, в UTF-8 представление буквы ‘G’ может содержать от 1 до 4 байт. Для перехода от однобайтового представления к многобайтовому используется функция TO_MULTI_BYTE . Данная функция является обратной по отношению к TO_SINGLE_BYTE .
  • TO_NCHAR(символы_в_наборе_базы_данных)
    Преобразует данные из набора символов базы данных в эквивалентное представление в национальном наборе символов. Также см. TO_CHAR и TRANSLATE. USING.

Функция TO_NCHAR также может использоваться для преобразования даты/времени и чисел в удобочитаемую форму.

  • TO_SINGLE_BYTE(строка1)
    Преобразует многобайтовые символы в их однобайтовые эквиваленты. Функция является обратной по отношению к TO_MULTI_BYTE .
  • TRANSLATE(строка1, искомый_набор, набор_замены)
    Заменяет в строке1 каждое вхождение символа из искомого_набора соответствующим символом набора_замены . Пример:

Если искомый_набор содержит больше символов, чем набор_замены , «лишние» символы, не имеющие соответствия в наборе_замены , не включаются в результат. Пример:

Буква « d » удалена, потому что она присутствует в искомом_наборе , но не имеет эквивалента в наборе_замены . Функция TRANSLATE заменяет отдельные символы, а функция REPLACE — целые строки.

  • TRANSLATE(текст USING CHAR_CS) и TRANSLATE(текст USING NCHAR_CS)
    Преобразует символьные данные в набор символов базы данных ( CHAR_CS ) или в национальный набор символов ( NCHAR_CS ). Выходным типом данных будет VARCHAR2 или NVARCHAR2 в зависимости от того, выполняется ли преобразование к набору символов базы данных или национальному набору символов соответственно.

Функция TRANSLATE. USING входит в число функций SQL по стандарту ISO. Начиная с Oracle9i Release 1, можно просто присвоить значение VARCHAR2 переменной типа NVARCHAR2 , и наоборот — система неявно выполнит нужное преобразование. Если же вы хотите выполнить преобразование явно, используйте функции TO_CHAR и TO_NCHAR для преобразования текста в набор символов базы данных и национальный набор символов соответственно. Oracle рекомендует пользоваться указанными функциями вместо TRANSLATE. USING , потому что они поддерживают более широкий набор входных типов данных.

  • TRIM(FROM строка1)
    Возвращает строку, полученную в результате удаления из строки1 всех начальных и конечных пробелов. У функции существуют следующие разновидности:
  • TRIM(LEADING FROM . )
    Удаление только начальных пробелов.
  • TRIM(TRAILING FROM . )
    Удаление только конечных пробелов.
  • TRIM(BOTH FROM . )
    Удаление как начальных, так и конечных пробелов (используется по умолчанию).
  • TRIM (. удаляемый_символ FROM строка1)
    Удаление вхождений одного удаляемого_символа на выбор программиста.

Функция TRIM была включена в Oracle8i для обеспечения более полной совместимости со стандартом ISO SQL. Она сочетает в себе функциональность LTRIM и RTRIM , но отличается от них тем, что TRIM позволяет задать только один удаляемый символ, тогда как при использовании LTRIM и RTRIM можно задать набор удаляемых символов.

  • UNISTR(строка1)
    Возвращает строку1, преобразованную в Юникод; таким образом, функция является обратной по отношению к ASCIISTR . Для представления непечатаемых символов во входной строке можно использовать запись \XXXX, где XXXX — кодовый индекс символа в Юникоде. Пример:

Функция предоставляет удобный доступ ко всему набору символов Юникода, в том числе и к тем, которые не могут вводиться непосредственно с клавиатуры.

  • UPPER(строка1)
    Преобразует все буквы заданной строки в верхний регистр. Тип возвращаемого значения соответствует типу входных данных (CHAR, VARCHAR2 , CLOB ). Функция является обратной по отношению к LOWER . Также см. NLS_UPPER .

Использование символьных, строковых функций и функций работы с датой в SQL

Функции, которые мы обсудим в этой части обычно используют встроенные PL/SQL код, сгруппированный в пакеты и поставляемый Oracle. Некоторые обрабатывают численные, символьные значения и значения даты, другие преобразуют данные в различные типы данных. Функции могут использовать вложенные вызовы и некоторые функции предназначены для работы со значением NULL. Функции условия CASE и DECODE позволяют отображать различный результат в зависимости от значений данных, что предоставляет возможность ветвления в контексте SQL запроса

Функции разделены на две большие группы: те, которые рассчитывают значения для каждой строки, и те, которые выполняют один рассчёт для всех строк. Мы рассмотрим функции конвертации, функции для работы с символьными данными, числовыми данными и данными типа дата.

Определение функции

Функция – это программа, которая может принимать (но необязательно) входные параметры, выполнять какие-либо операции и возвращать значение-литерал. Функция возвращает только одно значение за вызов.

Три важных компонента формируют базис определения функции. Первый – это список входных параметров. Он определяет ноль или более параметров, которые могут передаваться функции для обработки. Эти параметры, или аргументы, могут быть необязательными (иметь значение по умолчанию) и быть разными типами данных. Второй компонент – это тип данных вовзращаемого результата. После выполнения, только одно значение предопределенного типа данных возвращается функцией. Третий компонент инкапсулирует детали обработки выполняемой функцией и содержит программный код, который работает с входными параметрами, производит вычисления и возвращает значение.

Функция часто описывается как чёрный ящик, который берёт входные данные, делает что-то и возвращает результат. Вместо того, чтобы фокусироваться на деталях реализации функций, более полезно разобраться какой функционал предоставляют встроенные функции.

Вызовы функций могут быть вложенными, к примеру, как F1(x, y, F2(a, b), z), где функция F2 принимает два входных параметра и возвращает третий из четырёх параметров для функции F1. Функции могут работать с любыми типами данных: наиболее часто используемые это символьные и числовые данные, а также данные типа дата. Этими параметрами функции могут быть столбцами или выражениями.

Как пример можно рассмотреть функцию, которая рассчитывает возраст человека. Функция AGE принимает только один параметр, день рождения. Результат возвращаемый функцией AGE это число отображающее возраст человека. Расчёты черного ящика влючают в себя получение разницы в годах между текущей датой и днём рождения, переданным в качестве входного параметра.

Типы функций

Функции можно глобально разделить на две категории: обрабатывающие строку (строчные функции) и обрабатывающие набор строк (функции группировки). Это выделение очень важно для понимания контекста где используются различные функции.

Строчные функции

Доступны несколько видов строчных функций, включая функции работы со строками, функции работы с числами, датами, функции преобразования типа и общие функции. Эти функции обрабатывают одну строку из набора в момент времени. Если запрос выбирает десять строк, функция будет выполняться десять раз, по одному разу для каждой строки с возможным использованием значений столбцов строк как входных параметров функции.

Следующий запрос выбирает два столбца из таблицы REGIONS и выражение использующее функцию LENGTH и столбец REGION_NAME

select region_id, region_name, length(region_name) from regions;

Длина значения столбца REGION_NAME рассчитывается для каждой из четырёх строк в таблице REGIONS; функция выполняется четыре раза, возвращая каждый раз значение-литерал.

Строчные функции работают работают с данными элементами строки для выборки и форматирования их перед отображением. Входными значениями строчной функции может быть определенная пользователем константа или литерал, данные столбца, переменные или выражения, возможно использующие другифе вложенные строчные функции и т.д. Вложенные вызовы часто используемая техника. Функции могут возвращать значение типа данных, отличного от типа данных входных параметров. Прерыдущий запрос показывает, как функция LENGTH принимает входным значением строку и возвращает число.

Помимо использования функций в разделе SELECT строчные функции можно использовать в разделах WHERE и ORDER BY.

Функции, работающие с набором данных

Как можно догадаться из названия, эти функции оперируют больше чем одной строкой. Типичным использованием мультристрочной-функции является расчёт суммы или среднего значения какого-либо числового столбца или подсчёт количества строк в результате. Таким функции называются иногда функциями группировки, и мы рассмотрим их в следующей главе.

Использование функций, изменяющих регистр

Данные в таблицах могут заполняться из различных источников: программ, криптов и так далее. Не стоит полагаться что символьные данные будут вводиться в заранее определенном регистре. Строчные функции, изменяющие регистр предназначены для двух важных задач. Их можно использовать, во-первых, для изменения регистра данных при сохранении или выводе информации, либо в условиях WHERE для более гибкого поиска. Гораздо легче искать строку используя фиксированный регистр, вместро проверки всех комбинаций верхнего и нижнего регистра. Помните, что вызов функций не изменяет данные, которые хранятся в таблице. Они преобразуют данные результата запроса.

Входными параметрами могут быть символьные литералы, столбцы символьного типа данных, символьные выражения или числа и даты (которые неявно будут преобразованы в строки).

Функция LOWER

Функция LOWER заменяет все символы прописного регистра на эквивалентные символы строчного регистра. Синтакис функции LOWER(string). Рассмотрим пример запроса использующего эти функции

select lower(100+100), lower(‘SQL’), lower(sysdate) from dual

Преположим что текущая дата 17 декабря 2015 года. Результатом запроса будут строки ‘200’, ‘sql’ и ‘17-dec-2015’. Численное выражение и дата неявно преобразуются в строку перед вызовом функции LOWER.

В следующем примере функция LOWER используется для поиска строк где буквы ‘U’ и ‘R’ в любом регистре идут друг за другом

select first_name, last_name, lower(last_name) from employees

where lower(last_name) like ‘%ur%’;

Можно написать аналогичный запрос без использования функции LOWER. Например так

select first_name, last_name from employees

where last_name like ‘%ur%’ or last_name like ‘%UR%’

or last_name like ‘%uR%’ or last_name like ‘%Ur%’

Этот запрос работает, но он слишком громоздкий, и количество операторов OR возрастает экспоненциально по мере увеличения строки.

Функция UPPER

Функция UPPER логическая противоположность функции LOWER и заменяет все строчные символы на их прописные эквиваленты. Синтаксис функции – UPPER(string). Рассмотрим пример

select * from countries where upper(country_name) like ‘%U%S%A%’;

Этот запрос выбирает строки из таблцы COUNTRIES где COUNTRY_NAME содержит буквы ‘U’, ‘S’, ‘A’ в любом регистре в этом порядке.

Функция INITCAP

Функция INITCAP часто используется для отображения данных. Первые символы каждого слова в строке преобразуются к верхнему регистру, все остальные символы преобразуются в строчные эквиваленты. Под словом подразумевается набор символов не содержащих пробелов и спецсимволов. Пробел, символ подчеркивания а также спецсимволы такие как знак процента, восклицательные знак, знак доллара расцениваются как разделители. Функция INITCAP принимает один параметр и синтаксис INITCAP(string). Следующий пример показывает пример использования функции INITCAP

select initcap(‘init cap or init_cap or init%cap’) from dual

Результатом этого запроса будет строка Init Cap Or Init_Cap Or Init%Cap

Использование функций работы со строками

Функции работы со строками одна из самых мощных возможностей, предоставляемых Oracle. Они очень полезны и понятны практически без детальных объяснений и очень часто используются разными программистами при обработке данных. Часто используются вложенные вызовы этих функций. Оператор конкатенации может использоваться вместо функции CONCAT. Функции LENGTH, INSTR, SUBSTR и REPLACE могут дополнять друг друга, так же как RPAD, LPAD и TRIM.

Функция CONCAT

Функция CONCAT объединяет два литерала, столбца или выражения для составление одного большого выражения. У функции CONCAT два входных параметра. Синтаксис функции CONCAT(string1, string2) где string1 и string2 могут быть литералом, столбцом или выражением результат которого символьный литерал. Следующий пример показывает использование функции CONCAT

select concat(‘Today is:’,SYSDATE) from dual

Второй параметр функции это функция SYSDATE, которая возвращает текущее системное время. Значение преобразуется в строку и к ней присоединяется первый параметр. Если текущая системная дата 17 Декабря 2015 года, то запрос вернёт строку ‘Today is:17-DEC-2015’.

Рассмотрим как использовать функция для объединения трех элементов. Так как функция CONCAT может принимать только два входных параметра, то можно объединить только два элемента. В таком случае можно использовать вызов функции как параметр другово вызова функции. Тогда запрос будет выглядеть так

select concat(‘Outer1 ‘, concat(‘Inner1′,’ Inner2′)) from dual;

У первой функции два параметра: первый параметр это литерал ‘Outer1 ‘, а второй параметра это вложенная функция CONCAT. Вторая функция принимает два параметра: литерал ‘Inner1’ и литерал ‘ Inner2’. Результатом выполнения этого запроса будет строка ‘Outer1 Inner1 Inner 2’. Вложенные функции расмотрим чуть позже.

Функция LENGTH

Функция LENGTH возвращает число символов которые составляют строку. Пробелы, табуляция и специальные символы учитываются функцией LENGTH. У функции один параметра и синтаксис LENGTH(string). Рассмотрим запрос

select * from countries where length(country_name) > 10;

Функция LENGTH используется для выбора тех стран у которых длина названия больше чем десять символов.

Функции RPAD и LPAD

Функции RPAD и LPAD возвращают строку фиксированной длины и при необходимости дополняют исходное значение определенным набором символов слева или справа. Символами используемые для добавления могут быть литерал, значение столбца, выражение, пробел (значение по умолчанию), табуляция и спец символы. Функции LPAD и RPAD принимают три входных параметра и синтаксис LPAD(s, n, p) и RPAD(s, n, p) где s – значение строки для обработки, n – количество символов результата и p – символы для добавления. Если используется LPAD, то символы p добавляются слева до достижения длины n. Если RPAD – то справа. Обратите внимание что если длина s больше чем длина n – то результатом будет первые n символов значения s. Рассмотрим запросы на рисунке 10-1

Рисунок 10-1 – Использование функций RPAD и LPAD

Первый запрос не изменяет данные и результат не очень читабельный по сравнению с результатом второго запроса. RPAD используется для добавления пробелов там где необходимо для first_name и last_name чтобы все значения были фиксированной длины в 18 символов, и LPAD используется для добавления пробелов в начало значения salary до достижения длины 6 символов.

Функция TRIM

Функция TRIM убирает символы и начала или окончания строки чтобы сделать её потенцильно короче. Функция принимает обязательный параметр и необязательный. Синтаксис функции TRIM([trailing|leading|both] trimstring from string). Параметр входная строка (s) обязательный. Следующие пункты перечисляют параметры

  • TRIM(s) убираются пробелы в начале в к конце строки
  • TRIM(trailing trimstring from s) убирает символы trimgstring в конце строки
  • TRIM(leading trimstring from s) убирает символы trimgstring в начале строки
  • TRIM(both trimstring from s) OR TRIM(trimstring from s) убирают все символы trimstring в начале и в конце строки

select trim(both ‘*’ from ‘****Hidden****’),

trim(leading ‘*’ from ‘****Hidden****’),

trim(trailing ‘*’ from ‘****Hidden****’) from dual;

Вернёт “Hidden”, “Hidden****”, и “****Hidden”. Обратите внимание что, указав всего один символ, все символы убираются если они последовательно повторяются.

Функция INSTR

Функция INSTR ищет подстроку в строке. Возвращается число, обозначающее позицию откуда n-ное вхождение начинается, начиная с позиции поиска, относительно начала строки. Если подстрока не найдена в строке – возвращается 0.

У функции INSTR два параметра обязательных и два параметра необязательных. Синтаксис функции INSTR(source string, search string, [search start position], [n occurrence]). Значение по умолчанию для search start position=1 или другими словами начало строки source string. Значение по умолчанию для n occurrence=1 или первое вхождение. Рассмотрим несколько примеров

Query 1: select instr(‘1#3#5#7#9#’, ‘#’) from dual;

Query 2: select instr(‘1#3#5#7#9#’, ‘#’ ,5) from dual;

Query 3: select instr(‘1#3#5#7#9#’, ‘#’, 3, 4) from dual;

Первый запрос ищет первое вхождение хеш-тега в строке и возвращает значение 2. Второй запрос ищет хеш-тег в строке начиная с пятого символа и находит первое вхождение с 6 символа. Третий запрос ищет четвертое вхождение хеш-тега начиная с третьего символа и находит его в позиции 10.

Функция SUBSTR

Функция SUBSTR возвращает подстроку определённой длины из исходной строки начиная с определённой позиции. Если начальная позиция больше чем длина исходной строки – возвращается значение NULL. Если длины исходной строки недостаточно для получения значения необходимой длины начиная с определённой позиции, то возвращается часть строки с исходного символа до конца строки.

У функции SUBSTR три параметра, первые два обязательны и синтаксис SUBSTR(source string, start position, [number of characters]). Значение по умолчанию для characters to extract = разница между длиной source string и start position. Рассмотрим следующие примеры

Query 1: select substr(‘1#3#5#7#9#’, 5) from dual;

Query 2: select substr(‘1#3#5#7#9#’, 5, 3) from dual;

Query 3: select substr(‘1#3#5#7#9#’, -3, 2) from dual;

Запрос 1 возвращает подстроку начиная с позиции 5. Так как третий параметр не указан, количество символов равно длине исходной строки минус начальная позиция и будет равно шести. Первый запрос вернёт подстроку ‘5#7#9#’. Запрос два возвращает три символа начиная с пятого символа и строка результат будет ‘5#7’. Запрос три начинается с позиции минус три. Отрицательная начальная позиции говорит Oracle о том, что начальная позиция рассчитывается от конца строки. Таким образом начальная позиция будет длина строки минус три и равна 8. Третий параметр равен двум и возвращается значение ‘#9’.

Функция REPLACE

Функция REPLACE заменяет все вхождения искомого элемента на значение строки для подстановки. Если длина заменяемого элемента не равна длине элемента, на который происходит замена, длина получаемой строки будет отличной от исходной строки. Если искомая подстрока не найдена, строка возвращается без изменений. Доступно три параметра, два первых обязательные и синтаксис вызова REPLACE(source string, search element, [replace element]). Если явно не указать параметр replace element, то из исходной строки удаляются все вхождения search element. Другими словами, replace element равно пустой строке. Если все символы исходной строки заменяются пустым replace element возвращается NULL. Рассмотрим несколько запросов

Query 1: select replace(‘1#3#5#7#9#’,’#’,’->’) from dual

Query 2: select replace(‘1#3#5#7#9#’,’#’) from dual

Query 3: select replace(‘#’,’#’) from dual

Хеш в первом запрос обозначает символ для поиска и строка для замены ‘->’. Хеш появляется в строке пять раз и заменяется, получаем итоговую строку ‘1->3->5->7->9->’. Запрос 2 не указывает явно строку для замены. Значением по умолчанию является пустая строка и результатом будет ‘13579’. Запрос номер три вернёт NULL.

Использование численных функций

В Oracle доступно множество встроенных функций для работы с числами. Существенной разницой между численными функция и другими является то, что эти функции принимают параметрами только числа и возвращают только числа. Oracle предоставляет численные функции для работы с тригонометрическими, экспоненциальными и логарифмическими выражениями и со многими другими. Мы сфокусируемся на простых численных строчных функциях: ROUND, TRUNC и MOD.

Функция ROUND

Функция ROUND округляет число в зависимости от необходимой точности. Возвращаемое значение округляется либо в большую, либо в меньшую сторону, в зависимости от значения последней цифры в необходимом разряде. Если значение точности n, то цифра, которая будет округляться будет на позиции n после запятой, а значение будет зависеть от цифры на позиции (n+1). Если значение точности отрицательное, то все цифры после разряда n слева от запятой будут 0, а значение n будет зависеть от n+1. Если значение цифры от которой зависит округление больше или равно 5, то округление происходит в большую сторону, иначе в меньшую.

Функция ROUND принимает два входных параметра и синтаксис ROUND(source number, decimal precision). Source number может быть любым числом. Параметр decimal precision определяет необходимую точность и необязателен. Если этот параметр не указан, значение по умолчанию будет 0, что обозначает необходимость округления до ближайшего целого числа.

Рассмотрим таблицу 10-1 для числа 1601.916. Отрицательные значения точности находятся слева от точки (целая часть), когда положительные считаются вправо от точки (дробная часть).

Если значение точности единица, значение округляется до десятка. Если два, то значение округляется до второго порядка и т.д. Следующие запросы отображают использование этой функции

Query 1: select round(1601.916, 1) from dual;

Query 2: select round(1601.916, 2) from dual;

Query 3: select round(1601.916, -3) from dual;

Query 4: select round(1601.916) from dual;

Первый запрос использует параметр точности равные единице, что означает что число будет округлено до ближайшей десятой. Так как значение сотой части равно единице (меньше чем 5), то происходит округление в меньшую сторону и возвращается значение 1601.9. Точность второго запроса равна двойке, таким образом значение окружается до сотой. Так как значение тысячной части равно 6 (что больше 5), то значение сотой части округляется вверх и возвращается значение 1601.92. Значение параметра точности в третьем запросе равно минус трём. Так как значение отрицательное, это значит, что округление будет происходить, основываясь на значении третьей позиции слева от точки, во втором разряде (сотни), и значение 6. Так как 6 больше пяти, то происходит округление вверх и возвращается значение 2000. Запрос 4 вызывает функцию без параметра точности. Это означает что число округляется до ближайшего целого. Так как десятая часть равна 9, то значение округляется в большую сторону и возвращется значение 1602.

Численная функция TRUNC

Функия TRUNC сокращает значение числа основываясь на значение параметра точности. Сокращение отличается от округления тем, что при сокращении лишняя часть просто отрезается и не происходит никаких изменений остальных цифр числа. Если значение точности отрицательное, то входное значение сокращается на позиции слева от запятой. Синтаксис функции TRUNC(source number, decimal precision). Параметром source number может быть любое число и этот параметр обязателен. Параметр decimal precision определяет позицию округления и не обязателен, значением по умолчанию будет ноль, что означает сокращение до целого числа.

Если значение decimal precision равно одному, то число сокращается до десятых, если два, то до сотых и так далее. Рассмотрим несколько примеров использования этой функции

Query 1: select trunc(1601.916, 1) from dual;

Query 2: select trunc(1601.916, 2) from dual;

Query 3: select trunc(1601.916, -3) from dual;

Query 4: select trunc(1601.916) from dual;

В запросе 1 используется точность равная единице, что значит сокращение значения до десятых и возвращается значение 1601.9. Точность во втором запросе равна двум, исходное значение сокращается до сотых и возвращается значение 1601.91. Обратите внимание что получаемое значение будет отличаться от значения, возвращаемого функцией ROUND с такими же параметрами, так как при вызове ROUND произойдёт округление в большую сторону (6 больше 5). В запросе номер три используется отрицательное число как значение параметра точности. Позиция три слева от запятой означает что сокращение будет до третьего разряда (сокращаются сотни) как показано в таблице 10-1 и возвращаемое значение будет 1000. И наконец в четвертом запросе явно неуказано значение точности и сокращается дробная часть исходного числа. Результатом будет 1601.

Функция MOD

Функция MOD возвращает остаток от деления. Два числа, делимое (число которое делится) и делитель (число на которое делится) определяются как параметры и вычисляется операция деления. Если делимое делится на делитель нацело, то возвращается ноль, так как нет остатка. Если делитель ноль, то не происходит ошибки деления на ноль, а возвращается делимое. Если делитель больше чем делимое, возвращается делимое.

У функции MOD два входные параметра и синтаксис MOD(dividend, divisor). Параметры dividend и divisor могут быть численными литералами, столбцами или выражениями и могут быть положительными или отрицательными. Следующие примеры показывают использование этой функции

Query 1: select mod(6, 2) from dual

Query 2: select mod(5, 3) from dual

Query 3: select mod(7, 35) from dual

Query 4: select mod(5.2, 3) from dual

В запросе один 6 делится на два нацело без остатка и возвращается 0. В запросе два 5 делится на 3, целая часть будет 1 и возвращается остаток 2. В запросе номер три семь делится на 35. Так как делитель больше чем делимое – возвращается делимое, т.е. целая часть 0. Запрос четыре использует дробное число как делимое. Целой частью будет один и остаток будет 2.2.

Любое чётное число делится на два без остатка, любое нечётное число при делении на два вернёт остаток 1. Поэтому функцию MOD часто используют чтобы отличать чётные и нечётные числа.

Работа с датами

Функции работы с датами предлагают удобный способ решать задачи, связанные с датами без необходимости учитывать высокосные года, сколько дней в конкретном месяце. Вначале рассмотрим, как хранятся данные типа дата и форматирование даты, а также функцию SYSDATE. Затем рассмотрим функции ADD_MONTHS, MONTHS_BETWEEN, LAST_DAT, NEXT_DAY, ROUND и TRUNC.

Хранение даты в базе данных

База данных хранит данные как число, которое способно поддерживать расчёт века, года, месяца и дня, а также информации о времени, такой как час, минута и секунда. Когда происходит запрос к данным, на число накладывается определённое форматирование (маска), и по умолчанию маска отображает день, три первых буквы названия месяца и две цифры, отображающие год.

Функция SYSDATE

Функция SYSDATE не использует входные параметры и возвращает текущее время и дату установленную на сервере БД. По умолчанию функция SYSDATE возвращает дату в формате DD-MON-RR и отображает дату на сервере. Если сервер установлен в другом часовом поясе чем машина клиента, то время и дата, возвращаемые SYSDATE могут отличаться от локальных значений на клиентсой машине. Можно выполнить такой запрос для отображения системной даты на сервере

select sysdate from dual

Арифметика над датами

Следуещее уравнение отображает важный принцип при работе с датами

Date1 – Date2 = Num1

Дата может вычитаться из другой даты. Разница между двуми датами понимается как количество дней между ними. Любое число, включая дробные, может быть добавлено или вычтено из даты. В этом контексте число представляет собой количество дней. Сумма или разница между число и датой – это всегда дата. Этот принцип подразумевает что сложение, умножение или деление двух дат невозможен.

Функция MONTHS_BETWEEN

Функция MONTHS_BETWEEN возвращает количество месяцев между двумя обязательными входными параметрами. Синтаксис функции MONTHS_BETWEEN(date1, date2). Функция рассчитывает разницу между date1 и date2. Если date1 меньше чем date2, то возвращается отрицательное число. Возвращаемое значение может состоять из целой части, отражающей количество месяцев между двумя датами, и дробной части, отражающей сколько дней и часов осталось (основываясь на месяце равном 31 дню) после вычета целого количества месяцев. Целое число вовзращается если день сравниваемых месяцев одинаковый или последний день соответствующего месяца.

Следующие примеры используют функию MONTHS_BETWEEN

Query 1: select months_between(sysdate, sysdate-31) from dual;

Query 2: select months_between(’29-mar-2008′, ’28-feb-2008′) from dual;

Query 3: select months_between(’29-mar-2008′, ’28-feb-2008′) * 31 from dual;

Преположим что текущая дата 16 Апреля 2009. Запрос один вернёт один как количество месяцев между 16 апреля 2009 и 16 марта 2009. Запрос два неявно конвертирует литералы в даты используя формат DD-MON-YYYY. Так как часть о времени опущена Oracle установит значение времени 00.00.00 для обеих дат. Фукнция вернёт значение примерно равное 1.03225806. Целая часть результата обозначает что между датами один месяц. Между 28 февраля и 28 марта ровно один месяц. Тогда дробная часть должна показывать ровно один день. Результат включает в себя часы минуты и секунды, но в нашем случае временная составляющая дат одинаковая. Умножение 0.03225806 на 31 вернёт 1, так как дробная часть, возвращаемая MONTHS_BETWEEN, рассчитывается, допуская что месяц равен ровно 31 дню. Поэтому запрос номер три вернёт значение 32.

Популярной ошибкой является допущение что возвращаемый тип данных функции зависит от типа функции (функции работы с датой должны возвращать дату, функции обработки строк – строку). Это верное только для численных функций. Символьные функции и функции работы с датами могут возвращать значение любого типа данных. Например, INSTR явлется символьной функцией, а MONTS_BETWEEN функцией работы с датой, но обе они возвращают результатом число. Также часто ошибочно рассуждают что разница между датами – это дата, когда фактически это число.

Функция ADD_MONTHS

Функция ADD_MONTHS возвращает дату, полученную путём добавления определённого количества месяцев к исходной дате. У этой функции два обязательных параметра и синтаксис ADD_MONTHS(start date, number of months). Значение параметра number of months может быть отрицательным, тогда исходное значение будет уменьшаться на это количество месяцев и дробным, но учитываться будет только целая часть. Следующие три запроса показывают использование функции ADD_MONTHS

Query 1: select add_months(’07-APR-2009′, 1) from dual;

Query 2: select add_months(’31-DEC-2008′, 2.5) from dual;

Query 3: select add_months(’07-APR-2009′, -12) from dual;

Результатом первого запроса буде 7 мая 2009, так как день остаётся одинаковым если это возможно и месяц увеличивается на один. Во втором запросе число месяцев дробное, что игнорируется, то есть этот запроса равен ADD_MONTHS(’31-DEC-2008’,2). Добавление двух месяцев должно вернуть 31-FEB-2009, но такой даты не существует, поэтому возвращается последний день месяца. В последнем примере используется отрицательное число для параметра кол-во месяцев и возвращается дата 07-APR-2008 что на двенадцать месяцев раньше, чем исходное значение.

Функция NEXT_DAY

Функция NEXT_DATE возвращает следующий ближайший заданный день недели после исходной даты. У этой функции два обязательных параметра и синтаксис NEXT_DAY(start date, day of the week). Функция выичсляет значение, когда заданный day of the week наступит после start date. Параметр day of the week может быть задан как числом, так и строкой. Допустимые значения определяются параметром NLS_DATE_LANGUAGE и по умолчанию используются три первые буквы названия дня недели в любом регистре (SUN, mon etc) или целые числа где 1 равно воскресенью, 2 – понедельник и так далее. Также имена дней недели могут быть более чем три символа; например, воскресенье можно указать как sun, sund, Sunday. Рассмотрим несколько запросов

Query 1: select next_day(’01-JAN-2009′, ‘tue’) from dual;

Query 2: select next_day(’01-JAN-2009′, ‘WEDNE’) from dual;

Query 3: select next_day(’01-JAN-2009′, 5) from dual;

1 января 2009 года это четверг. Следущий вторник будет через 5 дней, 6 января 2009 года. Второй запрос вернёт 7 января 2009 – следующая среда после 1 января. Третий запрос использует число как параметр и если у вас установлены Американские значения, то пятый день — это четверг. Следующий четверг после 1 января ровно через неделю – 8 января 2009 года.

Функция LAST_DAY

Функция LAST_DAY возвращает дату последнего дня месяца исходной даты. Эта функция требует один обязательные параметр и синтаксис LAST_DAY(start date). Функция выбирает месяц исходной даты и затем расчитывает последний день месяца. Следующий запрос вернёт 31 января 2009 года

select last_day(’01-JAN-2009′) from dual;

Функция ROUND для работы с датами

Функция ROUND округляет значение даты до заданной точности даты. Возвращаемое значение округляется либо к большему, либо r меньшему значению в зависимости от значения округляемого элемента. Эта функция требует один обязательный параметр и допускает один необязательные и синтаксис функции ROUND(source date, [date precision forma]). Параметром source data может быть любой элемент типа данных дата. Параметр date precision format определяет уровень округления и значение по умолчанию – день. Параметром date precision format может быть век (CC) год YYYY квартал Q месяц M неделя W день DD час HH минута MI.

Округления до века эквивалентно добавление единицы к текущему веку. Округление до месяца будет в большую сторону если день больше 16 иначе будет округление до первого дня месяца. Если месяц от одного до шести округление будет до начала текущего года, иначе вернётся дата начала следующего года. Рассмотрим запрос

Предположим, что этот запрос был выполнен 17 апреля 2009 года в 00:05. Вначале происходит округление текущей даты до дня (параметр точности явно неуказан). Так как время 00:05 то день не округляется в большую сторону.Так как 1 апреля 2009 года это среда, то второй столбец вернёт среду той недели, в которую входит исходная дата. Первая среда недели, в которую входит 19 апреля – это 15 апреля 2009 года. Третий столбец оругляет месяц до следующего (так как 17 больше 16) и возвращает 01 мая 2009. Поледний столбец округляет дату до года и возвращает 1 явнваря 2009 года, так как апрель это 4ый месяц.

Функция TRUNC при работе с датами

Функция TRUNC сокращает дату основываясь на параметре точности. У этой функции один параметр обязательный и один нет и синтаксис вызова TRUNC(source date, [date precision format]). Параметром source date может быть любая валидная дата. Параметр date precision format определяет уровень сокращения даты и необязателен, значение по умолчанию – сокращение до дня. Это значит что все значения времени обнуляются – 00 часов 00 минут 00 секунд. Сокращение до месяца вернёт дату равную первому дню месяца исходной даты. Сокращение до года – вернёт первый день года исходной даты. Рассмотрим запрос, использующий функцию с разными параметрами

Этот запрос выполнятся 17 апреля в 00:05. Первый столбец сокращает системную дату до дня, время преобразуется из 00:05 в 00:00 (параметр точности явно неуказан, используется значение по умолчанию) и возвращается текущий день. Второй столбец сокращает дату до такого же дня недели, который был первого числа месяца (среда) и возвращает среду текущей недели – 15 апреля. Третий столбец сокращает дату до месяца и возвращает первый день месяца – 1 апреля. Четвертый столбец сокращает дату до года и возвращает первый день года.

Работа со строками

Любая строковая функция возвратит NULL, если строка результата превышает длину, установленную параметром сервера max_allowed_packet.

integer ASCII(str string)

Возвращает ASCII-код первого левого символа строки str. Возвращает 0, если строка str пустая. Возвращает NULL, если строка str не существует.

В случае, если первый левый символ строки str является многобайтовым, возвращает его код в формате: ((первый байт ASCII- код)*256+(второй байт ASCII -код))[*256+третий байт ASCII -код. ].

Если первый левый символ строки str не является многобайтовым, то действие аналогично действию функции ASCII() — возвращает ASCII-код первого левого символа строки str.

string CONV(int_or_str integer or string, from_base integer, to_base integer)

Мощная функция для конвертирования числа (int_or_str ) из одной системы исчисления (from_base) в другую систему (to_base). Возвращает NULL, если аргументы NULL. Минимальное значение .._base — 2, максимальное 36.

string BIN(int integer)

Возвращает двоичное значение аргумента int. Аналогично действию CONV(int,10,2). Возвращает NULL, если аргумент int NULL.

string OCT(int integer)

Возвращает восьмиричное значение аргумента int. Аналогично действию CONV(int,10,8). Возвращает NULL, если аргумент int NULL.

string HEX(int_or_str string or integer)

Возвращает шестнадцатиричное значение аргумента int_or_string. Аналогично действию CONV(int,10,16). Возвращает NULL, если аргумент int_or_string NULL.

Возвращает строку символов определенных кодом/кодами ASCII. Значение NULL пропускается.

string CONCAT(str1 string, str2 string. )

Объединяет строки Результатом является строка из состоящая из аргументов. Возвращает NULL, если какой либо из аргументов является NULL. Может быть более 2 аргументов. Числовые аргументы конвертируются в соответствующие строки.

string CONCAT_WS(separator string, str1 string, str2 string. )

Объединяет строки подобно функции CONCAT(), но с разделителем separator, который всавляется между строк-аргументов. Если separator является NULL, то результат будет NULL. Функция пропускает другие аргументы, если их значение NULL.

integer LENGTH(str string)

Функции возвращают длину строки str.

Примечание: многобайтовые символы считаются функцией CHAR_LENGTH().

integer OCTET_LENGTH(str string)

Функции возвращают длину строки str.

Примечание: многобайтовые символы считаются функцией CHAR_LENGTH().

integer CHAR_LENGTH(str string)

Функции возвращают длину строки str. Поддерживает многобайтовые символы.

integer CHARACTER_LENGTH(str string)

Функции возвращают длину строки str.

Примечание: многобайтовые символы считаются функцией CHAR_LENGTH().

integer POSITION(substr string IN str string)

Возвращает позицию первого вхождения подстроки substr в строке str. Возвращает 0, если substr не найдено в строке str. Поддерживает многобайтовые символы.

integer LOCATE(substr string, str string, pos integer)

LOCATE(substr string, str string) возвращает позицию первого вхождения подстроки substr в строке str. Возвращает 0, если substr не найдено в строке str. LOCATE(substr string, str string, pos integer) возвращает позицию первого вхождения подстроки substr в строке str, но начиная с pos. Возвращает 0, если substr не найдено в строке str (с учетом позиции, естественно). Поддерживает многобайтовые символы.

integer INSTR( str string, substr string)

Возвращает позицию первого вхождения подстроки substr в строке str. Возвращает 0, если substr не найдено в строке str (с учетом позиции, естественно). Поддерживает многобайтовые символы. Аналог LOCATE(), только аргументы поменяны местами.

string LPAD( str string, len integer, padstr string)

Возвращает строку str, добавив к началу str строку padstr и приведя общее количество символов в возвращенной строке к len. Если len больше, чем сумма длин строк, то разница за счет повторения строки padstr.

string RPAD( str string, len integer, padstr string)

Возвращает строку str, добавив к концу str строку padstr и приведя общее количество символов в возвращенной строке к len. Если len больше, чем сумма длин строк, то разница за счет повторения строки padstr.

string LEFT( str string, len integer)

Возвращает len первых символов изи строки str. Поддерживает многобайтовые символы.

string RIGHT( str string, len integer)

Возвращает len последних символов изи строки str. Поддерживает многобайтовые символы.

string SUBSTRING( str string, pos integer, len integer )

string SUBSTRING(str string FROM pos integer FOR len integer)

Возвращает подстроку строки str длиною len символов с позиции pos. Поддерживает многобайтовые символы. Вариант с «FROM » используется в синтаксисе ANSI SQL92. В функции SUBSTRING() если не указан аргумент len, то возвращает всю подстроку строки str с позиции pos.

string MID(str string, pos integer, len integer)

Возвращает подстроку строки str длиною len символов с позиции pos. Поддерживает многобайтовые символы. Вариант с «FROM » используется в синтаксисе ANSI SQL92. В функции SUBSTRING() если не указан аргумент len, то возвращает всю подстроку строки str с позиции pos.

string SUBSTRING_INDEX( str string, delim string, count integer)

Возвращает всю подстроку строки str с позиции определенной разделителем delim, находящимся по счету count.

string LTRIM( str string )

Возвращает строку str, удалив пробелы с начала строки. Поддерживает многобайтовые символы.

string RTRIM( str string )

Возвращает строку str, удалив пробелы с конца строки. Поддерживает многобайтовые символы.

string TRIM( [[BOTH | LEADING | TRAILING] [remstr] string FROM] str string )

С одним аргументом «str» — возвращает строку str, удалив пробелы с конца строки. Аргумент «remstr» определяет символ/подстроку для удаления. Поддерживает многобайтовые символы. mysql> select TRIM(‘ bar ‘); -> ‘bar’

string SOUNDEX( str string )

Вычисляет soundex ключ для str. Ключ soundex имеет такое свойство, что слова, произносимые одинакого, имеют одинаковый soundex ключ, и это может быть использовано для корректировки результатов поиска. Возвращает строку длиной 4 символа, начинающуюся буквой A-Z.

string SPACE( N integer )

Возвращает строку состоящую из N пробелов.

string REPLACE( str string, from_str string, to_str string)

Возвращает строку str, заменив в ней все подстроки from_str на to_str. Поддерживает многобайтовые символы.

string REPEAT( str string, count integer)

Возвращает строку, состоящую из count раз повтореной строки str. Возвратит NULL если один из аргументов NULL.

string REVERSE( str string )

Возвращает строку, в которой все символы с последнего на первый. См. пример. Поддерживает многобайтовые символы.

string INSERT( str string, pos integer, len integer, newstr string )

Возвращает строку str, со вставкой подстроки newstr, с позиции pos строки str и длиной len символов. Поддерживает многобайтовые символы.

string ELT( N integer, str1 string, str2 string, str3 string. )

Возвратит str1, если N = 1, str2 если N = 2, И так далее. Возвратит NULL если N меньше 1 больше количества аргументов.

integer FIELD( str string, str1 string, str2 string, str3 string. )

Возвратит индекс (номер по порядку) str из списка строк str1, str2, str3, . . Возвратит 0, если str не найдена в списке.

integer FIND_IN_SET( str string, strlist string )

Возвращает значение от 1 до . в зависимости от позиции строки str среди строк (подстрок) в строке strlist. Строки (подстроки) в strlist разделены «,». Возвращает 0, если str не найдена среди строк в strlist. Возвращает NULL, если один из аргументов NULL.

string MAKE_SET( bits, str1 string , str2 string . )

Возвращает одну из строк-аргументов в зависимости от побитового состояния bits. str1 возвратится при bit 0, str2 при bit 1, и так далее.

string EXPORT_SET( bits, on string , off string, [separator char, [number_of_bits integer]])

Возвращает строку, в которой для каждого бита выводится состояние on или off . Разделены состояния separator.

string LCASE( str string ) string

Возвращает строку str, заменив в ней все заглавные буквы на прописные. Поддерживает многобайтовые символы.(По умолчанию ISO-8859-1 Latin1).

string LOWER( str string )

Возвращает строку str, заменив в ней все заглавные буквы на прописные. Поддерживает многобайтовые символы.(По умолчанию ISO-8859-1 Latin1).

string UCASE( str string )

Возвращает строку str, заменив в ней все прописные буквы на заглавные. Поддерживает многобайтовые символы.(По умолчанию ISO-8859-1 Latin1).

string UPPER( str string )

Возвращает строку str, заменив в ней все прописные буквы на заглавные. Поддерживает многобайтовые символы.(По умолчанию ISO-8859-1 Latin1).

string LOAD_FILE( file_name string )

Читает файл и возвращает его контент в виде строки. file_name является полным путем к файлу на сервере. Необходимо следить за физическим наличием самого файла и соответствующими правами доступа скрипта к нему. Файл должен быть размером не более, чем установлено параметром max_allowed_packet. При возникновении проблем (отсутствие файла и тд.) возвращает NULL.

Топ-пост этого месяца:  Bootstrap что это такое и с чего начать изучение
Добавить комментарий