Перейти до основного вмісту
Модуль 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", яка приймає два параметри TEXT ('first_name' TEXT, 'last_name' TEXT).\nВона має повертати значення TEXT.\nУсередині виконайте тривіальний SELECT, який об’єднує два аргументи з одним пробілом між ними, і оголосите це як мову sql.

Завантаження редактора…
Показати підказку

ФУНКЦІЯ CREATE OR REPLACE get_full_name(first_name TEXT, last_name TEXT) ПОВЕРТАЄ ТЕКСТ ЯК $$ SELECT first_name || ' ' || прізвище; $$ LANGUAGE sql;

Рішення доступне після 3 спроб

вправи#sql.m12.l1.e2
Спроби: 0Завантаження…

У більш просунуті UDF ми можемо вбудовувати цілі запити. Створіть функцію 'get_customer_count()', яка не приймає параметрів і ПОВЕРТАЄ ЦІЛЕ ЧИСЛО.\nУсередині запустіть тривіальний 'SELECT COUNT(id) FROM customers'.\nОголосіть це як чисту мову sql.

Завантаження редактора…
Показати підказку

Слідкуйте: COUNT повертає bigint, переведіть його до INTEGER, щоб відповідати типу повернення! СТВОРИТИ АБО ЗАМІНИТИ ФУНКЦІЮ get_customer_count() ПОВЕРТАЄ ЦІЛЕ ЧИСЛО ЯК $$ SELECT CAST(COUNT(id) ЯК ЦІЛЕ ЧИСЛО) FROM клієнтів; $$ LANGUAGE sql;

Рішення доступне після 3 спроб