
- •7.4.3. Операции модификации строк
- •7.4.4. Операции удаления строк
- •7.5. Построение выражений
- •7.6. Средства определения, модификации и удаления представлений
- •7.7. Средства определения, модификации и удаления синонимов
- •7.8. Средства определения, модификации и удаления последовательностей
- •7.9. Средства определения, модификации и удаления пользователей
7.5. Построение выражений
При описании синтаксиса команд языка SQL достаточно часто применялось понятие выражение, вычисляемое значение которого использовалось в качестве результата запроса, в условиях выборки строк и в качестве нового значения колонок таблицы.
Построение выражений основано на использовании различных операторов и функций.
Для построения алгебраических выражений могут использоваться следующие операторы:
+, -, *, /
Кроме того, возможно использование встроенных математических функций. Перечислим основные из них:
ABS(n) – возвращает модуль числа n;
CEIL(n) – возвращает минимальное целое число, большее или равное n;
FLOOR(n) – возвращает максимальное целое число, меньшее или равное n;
COS(n), COSH(n), SIN(n), SINH(n), TAN(n), TANH(n) – возвращают синус, гиперболический синус, косинус, гиперболический косинус, тангенс и гиперболический тангенс числа n соответственно;
POWER(m, n) – возвращает результат возведения числа m в степень n;
SQRT(n) – возвращает квадратный корень числа n;
LN(n) - возвращает натуральный логарифм n;
LOG(m,n) – возвращает логарифм числа n по основанию m.
Для построения строковых выражений чаще всего используется оператор “||”, выполняющий конкатенацию (объединение, слияние) строк. Также могут быть использованы встроенные строковые функции:
CONCAT(char1, char2) – возвращает результат конкатенации строк char1 и char2;
INITCAP(char) - возвращает результат, представляющий собой преобразованную строку char, в которой в каждом слове первая буква приведена к верхнему регистру, а остальные – к нижнему;
LOWER(char) – преобразует строку char к нижнему регистру;
UPPER(char) – преобразует строку char к верхнему регистру;
LENGTH(char) – возвращает длину строки char.
Для работы с датами чаще всего используются следующие функции:
SYSDATE – возвращает системные дату и время (дату и время в СУБД Oracle);
ADD_MONTHS(d,n) – добавляет к дате d несколько месяцев n и возвращает в качестве результата новую дату;
LAST_DAY(d) –возвращает дату последнего дня месяца, который соответствует дате, заданной параметром d.
Для преобразования данных из одного типа в другой можно использовать функции преобразования типа данных:
TO_NUMBER(char) - преобразует строку char в число;
TO_CHAR(n) – преобразует число n в строку;
TO_CHAR(d, fmt) – преобразует дату d в строку в соответствии с форматом, заданным строкой fmt;
TO_DATE(char, fmt) – преобразует строку char в дату в соответствии с форматом, заданным строкой fmt.
Для России строка формата обычно задается 2-х видов:
‘DD.MM.YYYY’ – для даты без времени;
‘DD.MM.YYYY HH24:MI:SS’ – для даты со временем в 24-часовом виде.
Например, TO_DATE (‘11.09.1975’, ‘DD.MM.YYYY’).
Особое внимание следует уделить функции DECODE и конструкции CASE … END, которые достаточно часто используются на практике и позволяют производить условную подстановку значений.
Функция DECODE имеет произвольное количество аргументов, но как минимум три. В общем виде её синтаксис может быть представлен следующим образом:
DECODE(expr, val_1, result_1 [, val_2, result_2, …], [default])
Функция DECODE выполняет последовательное сравнение значения, указанного в параметре expr, с параметрами val_1, val_2 и т.д. В случае совпадения значения expr со значением val_1 в качестве результата будет возвращено значение result_1; в случае совпадения значения expr со значением val_2 в качестве результата будет возвращено значение result_2 и т.д. Если результат такого сравнения не увенчается успехом, то будет возвращено значение, указанное в параметре default (если параметр default не задан, то будет возвращен NULL).
Пример 23. Выбрать информацию о номере и наименовании всех проектов, номера которых меньше 6. Дополнительно вывести колонку, в которой для проектов с номерами меньше 4 будет представлен номер проекта прописью, а для всех остальных будет написано “больше 3-х”. Информацию упорядочить по номеру проекта.
Запрос для получения такой информации с использованием функции DECODE будет иметь вид:
SELECT proj_no, proj_name, DECODE(proj_no,1,'один',2,'два',3,'три','больше 3-х') nomer
FROM PROJECT
WHERE proj_no < 6
ORDER BY proj_no
Результат выполнения представленного запроса показан на рисунке 38.
Рис. 38. Результат запроса для примера 23
В запросах в качестве выражения возможно использование конструкции CASE … END, позволяющей реализовать более сложные варианты анализа данных и условной подстановки.
Конструкция CASE … END функционально шире и, будучи элементом языка SQL, а не функцией, работает быстрее.
Синтаксис такой конструкции может быть представлен в следующем виде:
CASE
WHEN условие1 THEN выражение1|подзапрос1
[ WHEN условие2 THEN выражение2|подзапрос2 ]
...
[ ELSE выражение|подзапрос ]
END
Конструкция CASE … END выполняет последовательно проверку условий, указанных после ключевых слов WHEN (условие1, условие2 и т.д.). В случае если условие истинно, в качестве результата работы конструкции возвращается значение выражения (выражение1, выражение2 и т.д.) или результат подзапроса (подзапрос1, подзапрос2 и т.д.), указанных после ключевого слова THEN. При этом подзапрос должен возвращать одну строку с одной колонкой. Если подзапрос не возвращает записей, то в результате выполнения конструкции будет возвращен NULL.
Если ни одно из условий, указанных после ключевых слов WHEN не выполнилось, то будет возвращено значение выражения или результат подзапроса, указанных после ключевого слова ELSE. Если ключевое слово ELSE отсутствует в конструкции CASE … END, то в этом случае результатом будет неопределенное значение NULL.
Запрос, рассмотренный в примере 23, может быть переписан c использованием конструкции CASE … END:
SELECT proj_no, proj_name,
(CASE
WHEN proj_no = 1 THEN 'один'
WHEN proj_no = 2 THEN 'два'
WHEN proj_no = 3 THEN 'три'
ELSE 'больше 3-х'
END) nomer
FROM PROJECT
WHERE proj_no < 6
ORDER BY proj_no
Существуют и другие встроенные в СУБД Oracle функции. Их подробное описание можно найти в документации к СУБД Oracle.