Уроки модуля (1/4)
UDF и базовый SQL
До сих пор мы отправляли запросы с сервера Node.js. Но если формула используется в десятках различных запросов (например, для расчета окончательной цены с учетом НДС), зачем дублировать математические вычисления в JavaScript? Функции SQL (пользовательские функции - UDF) позволяют нам создавать «макросы» внутри самой БД.
Вот как создать математический макрос SQL:
CREATE OR REPLACE FUNCTION calculate_tax(price NUMERIC)
RETURNS NUMERIC AS $$
SELECT price * 1.22;
$$ LANGUAGE sql;После запуска этой команды функция навсегда останется в нашей базе данных. Его можно вызвать из любого запроса:
SELECT name, calculate_tax(unit_price) AS price_with_tax FROM products;Динамическое создание
Мы можем определить столько переменных, сколько захотим, указав их типы, и LANGUAGE sql выполнит запрос и неявно вернет последний оператор, помещенный между знаками доллара $$.
Попробуйте сами
Создайте простую вызываемую функцию с именем «get_full_name», которая принимает два параметра ТЕКСТ («первое_имя» ТЕКСТ, «фамилия» ТЕКСТ).\nОна должна возвращать значение ТЕКСТ.\nВнутри выполните тривиальный оператор SELECT, который объединяет два аргумента с одним пробелом между ними, и объявите его как язык sql.
Показать подсказку
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ get_full_name(first_name TEXT, Last_name TEXT) ВОЗВРАЩАЕТ ТЕКСТ КАК $$ SELECT first_name || ' ' || фамилия; $$ ЯЗЫК sql;
Решение доступно после 3 попыток
В более продвинутые пользовательские функции мы можем встраивать целые запросы. Создайте функцию get_customer_count(), которая не принимает никаких параметров и ВОЗВРАЩАЕТ ЦЕЛОЕ ЧИСЛО.\nВнутри запустите тривиальную команду SELECT COUNT(id) FROM customer.\nОбъявите ее как чистый язык sql.
Показать подсказку
Внимание: COUNT возвращает bigint, приведите его к INTEGER, чтобы он соответствовал типу возвращаемого значения! СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ get_customer_count() ВОЗВРАЩАЕТ ЦЕЛОЕ ЧИСЛО КАК $$ SELECT CAST(COUNT(id) AS INTEGER) FROM customer; $$ ЯЗЫК sql;
Решение доступно после 3 попыток