Пользовательские функции в SQLite

Обычно СУБД предоставляют множество встроенных функций. Но все равно их иногда не хватает, и тогда приходится писать собственные пользовательские функции на «чистом» SQL или производном языке (вроде pl/sql в Оракле или pl/pgsql в Постгресе).

По умолчанию SQLite не поддерживает пользовательские функции. Но вы легко можете включить их с помощью расширения sqlean-define.

Примечание. В отличие от других СУБД, добавить расширение в SQLite элементарно. Скачиваете файл, выполняете одну команду — и готово.

Пользовательские функции

С sqlean-define несложно определить собственную функцию:

select define('sumn', ':n * (:n + 1) / 2');

А затем использовать, как будто встроенную:

select sumn(5);
-- 15

Пользовательские функции могут принимать несколько параметров и вызывать другие функции.

Сгенерировать случайное N, такое что a ≤ N ≤ b:

select define('randint', ':a + abs(random()) % (:b - :a + 1)');
select randint(10, 99);
-- 42
select randint(10, 99);
-- 17
select randint(10, 99);
-- 29

Показать все пользовательские функции:

select * from sqlean_define;

Удалить функцию:

select undefine('sumn');

Можно даже задать функцию, которая возвращает несколько значений!

Динамический SQL

Если функции не нужны, а хочется динамически составить SQL-запрос и выполнить его — поможет функция eval():

select eval('select 10 + 32');
-- 42

Можно выполнять любые DDL и DML запросы:

select eval('create table tmp(value int)');
select eval('insert into tmp(value) values (1), (2), (3)');
select eval('select value from tmp');
select eval('drop table tmp');

Установка

  1. Скачайте свежий релиз

  2. Подключите в командной строке SQLite (sqlite.exe):

sqlite> .load ./define
sqlite> select define('sumn', ':n * (:n + 1) / 2');
sqlite> select sumn(5);

Как установить расширение для IDE, Python и других сценариев.

Документация расширения с подробным описанием.

Подписывайтесь на канал, чтобы не пропустить новые заметки 🚀