Шрифт:
Интервал:
Закладка:
UPDATE MEMBERSHIP
SET MEMBER_CODE = MEMBER_GROUP || CAST(MEMBER_ID AS CHAR(8))
WHERE MEMBER_CODE IS NULL;
Связанные материалыСм. главу 8, где более подробно осуждается функция CAST(), а также последующие главы, в которых индивидуально рассматриваются типы данных.
EXTRACT()Эта функция выделяет часть полей типа данных DATE, TIME и TIMESTAMP в виде числа.
ДоступностьDSQL, PSQL, ISQL, ESQL, Firebird 1.5 и выше. Любая платформа.
СинтаксисEXTRACT(часть FROM поле)
Необязательные ключевые словаYEAR | MONTH | DAY | HOUR | MINUTE | SECOND | WEEKDAY | YEARDAY
Аргументычасть является одним значением из указанного списка необязательных ключевых слов, WEEKDAY выделяет день недели (воскресенье = 1, понедельник = 2 и т.д.), YEARDAY выделяет день в году (от 1 января = 1 до 366).
поле- поле типа данных DATE, TIME или TIMESTAMP (столбец, переменная или выражение).
Возвращаемое значениеВсе части возвращают SMALLINT за исключением SECOND, которое возвращает
DECIMAL(6,4).
ЗамечанияEXTRACT будет работать только со значениями, которые преобразуются к полям дата/время.
ПримерСледующий оператор возвращает имена и дни рождения, упорядоченные no BIRTHDAY, для всех участников, имеющих день рождения в текущем месяце:
SELECT
FIRST_NAME,
LAST_NAME,
EXTRACT(DAY FROM DATE_OF_BIRTH) AS BIRTHDAY
FROM MEMBERSHIP
WHERE DATE_OF_BIRTH IS NOT NULL
AND EXTRACT (MONTH FROM DATE_OF_BIRTH) = EXTRACT (MONTH FROM
CURRENT_DATE)
ORDER BY 3;
Строковые функцииFirebird имеет только две внутренние строковые функции. Большое количество строковых функций доступно во внешних функциях (см. следующий раздел этой главы).
SUBSTRING()SUBSTRING() является внутренней функцией, реализующей функцию ANSI SQL SUBSTRING(). Она возвращает поток, состоящий из байта с номером начальная-позиция и всех последующих байтов до конца строки значение. Если указано необязательное предложение FOR длина, она вернет меньшее из длина байт и количество байт до конца входного потока.
ДоступностьDSQL, PSQL, ISQL, ESQL, Firebird 1.5 и выше. Любая платформа.
СинтаксисSUBSTRING(значение FROM начальная-позиция [FOR длина])
Необязательные ключевые словаНеобязательное предложение FOR задает длину возвращаемой подстроки.
Аргументызначение может быть любым выражением, константой или идентификатором столбца, который преобразуется в строку.
начальная-позиция должна преобразовываться в целое >= 1. Не может быть заменяемым параметром.
длина должна преобразовываться в целое >= 1. Не может быть заменяемым параметром.
Возвращаемое значениеВозвращаемое значение является строкой.
ЗамечанияЗначения начальная-позиция и длина являются позициями байтов, что имеет значение для многобайтовых наборов символов.
Для строкового аргумента функция будет обрабатывать любой набор символов. Вызывающий оператор ответственен за обработку всех проблем, связанных с многобайтовыми наборами символов.
Для аргументов столбцов BLOB указанный столбец должен быть двоичным BLOB (SUB_TYPE 0) или текстовым BLOB (SUB_TYPE 1) с набором символов один байт на символ. В настоящий момент функция не обрабатывает текстовые BLOB с наборами символов Chinese (максимум два байта на символ) и Unicode (максимум три байта на символ).
ПримерСледующий оператор будет изменять значение столбца COLUMNB, присваивая ему строку до 99 символов, начиная с четвертой позиции оригинальной строки:
UPDATE ATABLE
SET COLUMNB = SUBSTRING (COLUMNB FROM 4 FOR 99)
WHERE ...
Связанные или похожие функцииСм. также внешние функции SUBSTR(), SUBSTRLEN() и RTRIM().
UPPER()Преобразует все символы строки в верхний регистр.
ДоступностьDSQL, PSQL, ISQL, ESQL; обеспечивает работу со строками в тех наборах символов и последовательностях сортировки, которые поддерживают преобразование нижний/верхний регистры. Любая платформа.
СинтаксисUPPER(значение)
Аргументызначение является столбцом, переменной или выражением, которое преобразуется в строковый тип.
Возвращаемое значениеЕсли набор символов и последовательность сортировки поддерживают преобразование в верхний регистр, функция возвращает строку, в которой все символы преобразованы в верхний регистр. Строка имеет ту же длину, что и входное значение. Для наборов символов, не поддерживающих преобразование в верхний регистр, функция возвращает неизмененное входное значение,[76]
ЗамечанияВходное значение не может иметь тип данных BLOB.
ПримерСледующее ограничение CHECK проверяет входную строку, выясняя, содержит ли она все символы в верхнем регистре:
ALTER TABLE MEMBERSHIP
ADD CONSTRAINT CHECK_LOCALITY_CASE
CHECK(LOCALITY = UPPER(LOCALITY));
Связанные или похожие функцииСм. также внешние функции LOWER() и F_PROPERCASE().
Функция для получения значения генератораФункция GEN_ID() является механизмом, с помощью которого модули PSQL и приложения получают числа от генераторов. Генераторы подробно обсуждаются в главе 9. См. также разд. "Реализация автоинкрементных ключей" главы 31.
GEN_ID()GEN_IDO вычисляет и возвращает значение генератора.
ДоступностьDSQL, PSQL, ISQL, ESQL, Firebird 1.5 и выше. Любая платформа. Синтаксис
GEN_ID(значение1, значение2)
Аргументызначение1 является идентификатором существующего генератора.
значение2 является значением шага - целый тип или выражение, которое преобразуется в целый тип.
Возвращаемое значениеВозвращается значение типа BIGINT.
ЗамечанияОбычно значение шага- единица. Значение шага 0 вернет последнее значение генератора. Возможно большее значение шага, так же как и отрицательное значение. При этом вам не следует использовать отрицательные значения, если только вы действительно не хотите получить последующее значение.
GEN_IDO всегда выполняется вне контекста какой-либо транзакции. Эта операция в Firebird доступна только пользователю. Как только число будет получено от генератора, оно никогда не будет создано тем же генератором, за исключением случаев, когда пользователь изменит последовательность, используя отрицательную величину шага, или с помощью оператора SET GENERATOR.
ПримерСледующий оператор возвращает новое значение генератора GEN_SERIAL:
SELECT GEN_ID(GEN_SERIAL, 1) FROM RDB$DATABASE;
В приведенном далее примере генератор используется в триггере BEFORE INSERT для получения значения первичного ключа:
CREATE TRIGGER BI_AUTHORS FOR AUTHORS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.AUTHOR_ID IS NULL) THEN
NEW.AUTHOR_ID = GEN_ID(GEN_AUTHOR_ID, 1);
END ^
Агрегатные функцииАгрегатные (обобщенные) функции выполняют вычисления над значениями столбца, например, значениями, выбранными из числового столбца запрашиваемого набора.
Firebird имеет группу агрегатных функций, которые чаще всего используются в комбинации с условиями группирования для вычисления итогов или статистики на уровне группы. Агрегатными функциями являются: SUM(), вычисляющая итог, MAX() и MIN(), возвращающие наибольшее и наименьшее значение соответственно, и AVG(), вычисляющая среднее значение. Функция COUNT() также ведет себя как агрегатная функция в сгруппированных запросах.
В главе 23 более подробно рассматривается участие агрегатных функций в сгруппированных запросах.
"Негруппированные" объединенияВ небольшом количестве случаев агрегатные функции могут оперировать с наборами, которые не являются субъектами предложения GROUP BY и возвращающими не более одной строки. Логически результат подобного запроса не может выводить значения любого столбца базы данных или значения, полученные от неагрегатных функций. Для иллюстрации рассмотрим следующий запрос, который объединяет бюджеты одного проекта за один фискальный год. Таблица имеет одну запись бюджета для каждого из пяти отделов:
SELECT
'MKTPR-1994' AS PROJECT,
SUM(PROJECTED_BUDGET) AS TOTAL_BUDGET
FROM PROJ_DEPT_BUDGET
WHERE PROJ_ID = 'MKTPR' AND FISCAL_YEAR = 1994;
Выходом будет одна строка: строковое поле времени выполнения и вычисленный итог.
Внешние функции (UDF)
Внешние функции являются вспомогательными программами, написанными на языке программирования, таком как С, C++ или Pascal, и скомпилированными как совместно используемые двоичные библиотеки- DLL в Windows или совместно используемые объекты для других платформ, которые поддерживают динамическую загрузку. Как и стандартные встроенные функции SQL, внешние функции могут быть разработаны для выполнения преобразований или вычислений, реализация которых либо слишком сложна, либо вовсе невозможна средствами языка SQL.
- Delphi. Учимся на примерах - Сергей Парижский - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Психбольница в руках пациентов - Алан Купер - Программирование