Использование операторов

Статья основана на тринадцатом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK video.

В данной статье подробно разбираются использование, переопределение операторов, их ключевые преимущества и ограничения.

В прошлой статье мы разобрали составные типы данных и их ограничения, вычисляемые поля и их минусы.

Презентация и исходники доступны по ссылке.

Переопределение оператора

Переопределение операторов в PostgreSQL — это мощный механизм, позволяющий изменять поведение стандартных операторов (+, -, =, >, < и др.) для пользовательских типов данных. Это особенно полезно при работе с сложными структурами данных.

Создадим тип для комплексных чисел:

CREATE TYPE complex AS (
  real DOUBLE PRECISION,
  imag DOUBLE PRECISION
);

Напишем функцию сложения двух комплексных чисел:

CREATE FUNCTION complex_add(complex, complex)
RETURNS complex AS $$
BEGIN
  RETURN ROW(
    $1.real + $2.real,
    $1.imag + $2.imag
  )::complex;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

Создаем кастомный оператор + и связываем с ним функцию:

CREATE OPERATOR + (
  LEFTARG = complex,
  RIGHTARG = complex,
  PROCEDURE = complex_add,
  COMMUTATOR = +
);

Теперь можно использовать оператор сложения в просто sql для нашего составного типа:

SELECT ROW(3, 4)::complex + ROW(1, 2)::complex;

Операторы. Ключевые преимущества

  • Естественный синтаксис — a + b вместо явного вызова функции complex_add(a, b)
  • Интеграция с SQL — работают в WHERE, ORDER BY, JOIN
  • Поддержка индексов — через классы операторов
  • Полиморфизм — один оператор для разных типов (17 тема)
  • Оптимизация — планировщик учитывает пользовательские операторы.

Ограничения

  • Нельзя переопределить встроенные операторы для базовых типов
  • Требует тщательного тестирования
  • Может усложнить понимание кода

Больше примеров доступно на гитхабе и в видео.

В следующей статье мы разберём входных и выходных параметров, передачу массива.


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

тринадцать − два =