Перейти к содержимому

Функции

Функция применяется к одному или нескольким значениям и возвращает результат. Запись — имя функции и аргументы в скобках: round(grade, 2).

Здесь приведены функции, чаще всего нужные при работе с блочной моделью. Полный список — Справочник функций.

Функция Описание Пример
abs(x) Модуль (абсолютное значение) abs(-3.2) -> 3.2
round(x) Округление до целого round(1.7) -> 2
round(x, n) Округление до n знаков после запятой round(0.12345, 2) -> 0.12
floor(x) Округление вниз floor(1.9) -> 1
ceil(x) Округление вверх ceil(1.1) -> 2
power(x, n) Возведение в степень power(2, 3) -> 8
sqrt(x) Квадратный корень sqrt(9) -> 3
ln(x) Натуральный логарифм ln(2.71828) -> 1
log(x) Десятичный логарифм log(100) -> 2
log(b, x) Логарифм по основанию b log(2, 8) -> 3
exp(x) Экспонента exp(1) -> 2.71828
trunc(x, n) Отбросить знаки после n-го trunc(1.789, 1) -> 1.7

Функция log с одним аргументом — десятичный логарифм, а не натуральный.

Пример: содержание с округлением до 3 знаков:

round(grade * recovery, 3)
Функция Описание
least(a, b, c, ...) Минимальное из аргументов
greatest(a, b, c, ...) Максимальное из аргументов

Пример: ограничить содержание сверху и снизу:

least(greatest(grade, 0.0), 10.0)

Это «зажим» (clamp). Значения ниже 0.0 становятся 0.0, выше 10.0 — 10.0.

coalesce подставляет значение по умолчанию вместо пропуска, например плотность из константы, если в колонке она не задана:

coalesce(density, $density_default)

Как работает функция и где она нужна, разобрано в статье Работа с NULL.

Функция Описание Пример
upper(s) В верхний регистр upper('ore') -> 'ORE'
lower(s) В нижний регистр lower('Waste') -> 'waste'
trim(s) Убрать пробелы по краям trim(' ore ') -> 'ore'
length(s) Длина строки length('ore') -> 3
concat(a, b, ...) Склеить строки concat('zone_', zone) -> 'zone_NW'
substring(s, n, len) Подстрока с позиции n длиной len substring('ABC123', 4, 3) -> '123'
replace(s, old, new) Замена подстроки replace(rock, '-', '_')

Пример: нормализовать тип породы (убрать пробелы и привести к нижнему регистру):

lower(trim(rock))

cast(значение as тип) — явно преобразует значение в указанный тип.

Тип Когда применять
double Дробное число (вещественное)
bigint или integer Целое число
varchar Строка
boolean Логическое (true/false)

Пример: колонка хранит число как строку — превратить в число:

cast(grade_txt as double)

Пример: превратить число в строку для склейки:

concat('block_', cast(xc as varchar), '_', cast(yc as varchar))

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

Если данные грязные и преобразование может не получиться, вместо cast берётся try_cast — при неудаче он даёт NULL, а не ошибку на всей колонке:

try_cast(grade_txt as double)
Функция Описание
sin(x), cos(x), tan(x) Углы в радианах
asin(x), acos(x), atan(x), atan2(y, x) Обратные функции
radians(deg) Градусы -> радианы
degrees(rad) Радианы -> градусы
pi() Число π

Пример: перевести угол откоса 45° в тангенс:

tan(radians(45))

Эти две функции добавлены в Pitlord и в обычном SQL не встречаются. Обе считают, на сколько ступеней значение ушло от границы, — типовая задача при ступенчатой стоимости добычи по глубине или высоте.

Функция Описание
steps_below(value, edge, step) Число ступеней высотой step, на которое value опустилось ниже edge. Если value >= edge — 0
steps_above(value, edge, step) Число ступеней высотой step, на которое value поднялось выше edge. Если value <= edge — 0

Результат — целое число, округление всегда вверх (неполная ступень считается целой):

steps_below(33, 35, 5) -- 1 (ушли на 2 м, начата первая ступень)
steps_below(21, 35, 5) -- 3 (ушли на 14 м)
steps_below(45, 35, 5) -- 0 (выше границы)

Если любой из аргументов NULL, результат NULL. Шаг должен быть больше нуля, иначе выражение вернёт ошибку.

Пример: к базовой ставке добычи добавляется 0.15 ден.ед за тонну на каждые 10 м ниже отметки 400:

$mining_ore + steps_below(zc, 400, 10) * 0.15

Пример: то же за подъём выше отметки 700 — транспортировка вверх:

$mining_ore + steps_above(zc, 700, 10) * 0.10

Конструкция case when универсальна, но для одной проверки бывает короче:

case when grade is null then 0 else grade end
-- равно:
coalesce(grade, 0)
case when grade >= 0.5 then 1 else 0 end
-- эквивалент через арифметику (для логических -> числа):
cast(grade >= 0.5 as integer)

Когда условие сложное, case when читается лучше. Когда условие простое, coalesce или cast короче.