Перейти к основному содержимому
Модуль 12 · Урок 1 из 445/57 в курсе~15 min
Уроки модуля (1/4)

UDF и базовый SQL

До сих пор мы отправляли запросы с сервера Node.js. Но если формула используется в десятках различных запросов (например, для расчета окончательной цены с учетом НДС), зачем дублировать математические вычисления в JavaScript? Функции SQL (пользовательские функции - UDF) позволяют нам создавать «макросы» внутри самой БД.

Вот как создать математический макрос SQL:

SQL
CREATE OR REPLACE FUNCTION calculate_tax(price NUMERIC)
RETURNS NUMERIC AS $$
  SELECT price * 1.22;
$$ LANGUAGE sql;

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

SQL
SELECT name, calculate_tax(unit_price) AS price_with_tax FROM products;

Динамическое создание

Мы можем определить столько переменных, сколько захотим, указав их типы, и LANGUAGE sql выполнит запрос и неявно вернет последний оператор, помещенный между знаками доллара $$.

Попробуйте сами

Упражнение#sql.m12.l1.e1
Попыток: 0Загрузка…

Создайте простую вызываемую функцию с именем «get_full_name», которая принимает два параметра ТЕКСТ («первое_имя» ТЕКСТ, «фамилия» ТЕКСТ).\nОна должна возвращать значение ТЕКСТ.\nВнутри выполните тривиальный оператор SELECT, который объединяет два аргумента с одним пробелом между ними, и объявите его как язык sql.

Загрузка редактора…
Показать подсказку

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ get_full_name(first_name TEXT, Last_name TEXT) ВОЗВРАЩАЕТ ТЕКСТ КАК $$ SELECT first_name || ' ' || фамилия; $$ ЯЗЫК sql;

Решение доступно после 3 попыток

Упражнение#sql.m12.l1.e2
Попыток: 0Загрузка…

В более продвинутые пользовательские функции мы можем встраивать целые запросы. Создайте функцию 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 попыток