Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Возвращаемое значение является строкой.
Значения начальная-позиция и длина являются позициями байтов, что имеет значение для многобайтовых наборов символов.
Для строкового аргумента функция будет обрабатывать любой набор символов. Вызывающий оператор ответственен за обработку всех проблем, связанных с многобайтовыми наборами символов.
Для аргументов столбцов BLOB указанный столбец должен быть двоичным BLOB (SUB_TYPE 0) или текстовым BLOB (SUB_TYPE 1) с набором символов
Следующий оператор будет изменять значение столбца COLUMNB, присваивая ему строку до 99 символов, начиная с четвертой позиции оригинальной строки:
UPDATE ATABLE
SET COLUMNB = SUBSTRING (COLUMNB FROM 4 FOR 99)
WHERE ...
См. также внешние функции SUBSTR, SUBSTRLEN и RTRIM.
Преобразует все символы строки в верхний регистр.
DSQL, PSQL, ISQL, ESQL; обеспечивает работу со строками в тех наборах символов и последовательностях сортировки, которые поддерживают преобразование нижний/верхний регистры. Любая платформа.
UPPER(значение)
значение является столбцом, переменной или выражением, которое преобразуется в строковый тип.
Если набор символов и последовательность сортировки поддерживают преобразование в верхний регистр, функция возвращает строку, в которой все символы преобразованы в верхний регистр. Строка имеет ту же длину, что и входное значение. Для наборов символов, не поддерживающих преобразование в верхний регистр, функция возвращает неизмененное входное значение, [76]
Входное значение не может иметь тип данных BLOB.
76
До Firebird 1.5 функция UPPER работала только для столбцов COLLATE PXW_CYRL (или при явном указании для конкретного столбца). В Firebird 1.5 таблица перекодировки символов в верхний регистр есть и в "умолчательном" COLLATE WIN1251.
– Прим. науч. ред.
Следующее ограничение CHECK проверяет входную строку, выясняя, содержит ли она все символы в верхнем регистре:
ALTER TABLE MEMBERSHIP
ADD CONSTRAINT CHECK_LOCALITY_CASE
CHECK(LOCALITY = UPPER(LOCALITY));
См. также внешние функции LOWER и F_PROPERCASE.
Функция GEN_ID является механизмом, с помощью которого модули PSQL и приложения получают числа от генераторов. Генераторы подробно
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 и возвращающими не более одной строки. Логически результат подобного запроса не может выводить значения любого столбца базы данных или значения, полученные от неагрегатных функций. Для иллюстрации рассмотрим следующий запрос, который объединяет бюджеты одного проекта за один фискальный год. Таблица имеет одну запись бюджета для каждого из пяти отделов: