Функции
Функция применяется к одному или нескольким значениям и возвращает результат. Запись — имя функции и аргументы в скобках: 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.
Работа с NULL
Заголовок раздела «Работа с NULL»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
Заголовок раздела «Функции Pitlord»Эти две функции добавлены в 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 короче.