Важно: Данный раздел актуален для Платформы данных в Публичном облаке и On-Premise.
Условное выражение. В отличии от большинства систем, RT.WideStore всегда считает оба выражения then и else.
Синтаксис:
SELECT if(cond, then, else)
Если условие cond не равно нулю, то возвращается результат выражения then. Если условие cond равно нулю или является NULL, то результат выражения then пропускается и возвращается результат выражения else.
Параметры:
Возвращаемые значения:
Функция выполняет выражения then или else и возвращает его результат, в зависимости от того, было ли условие cond равно нулю или нет.
Пример:
Запрос:
SELECT if(1, plus(2, 2), plus(2, 6))
Ответ:
┌─plus(2, 2)─┐
│ 4 │
└─────────────┘
Запрос:
SELECT if(0, plus(2, 2), plus(2, 6))
Ответ:
┌─plus(2, 6)─┐
│ 8 │
└─────────────┘
Работает так же, как функция if.
Синтаксис: cond ? then : else.
Возвращает then, если cond верно (больше нуля), в остальных случаях возвращает else.
Смотрите также:
Позволяет более компактно записать оператор CASE в запросе.
Синтаксис:
multiIf(cond_1, then_1, cond_2, then_2...else)
Параметры:
Функция принимает 2N+1 параметров.
Возвращаемые значения:
Пример:
Рассмотрим таблицу:
┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴───────┘
Выполним запрос SELECT multiIf(isNull(y), x, y < 3, y, NULL) FROM t_null. Результат:
┌─multiIf(isNull(y), x, less(y, 3), y, NULL)─┐
│ 1 │
│ ᴺᵁᴸᴸ │
└────────────────────────────────────────────────┘
Все функции возвращают число типа Float64. Точность результата близка к максимально возможной, но результат может не совпадать с наиболее близким к соответствующему вещественному числу машинно представимым числом.
Возвращает число типа Float64, близкое к числу e.
Возвращает число типа Float64, близкое к числу π.
Принимает числовой аргумент, возвращает число типа Float64, близкое к экспоненте от аргумента.
Принимает числовой аргумент, возвращает число типа Float64, близкое к натуральному логарифму от аргумента.
Принимает числовой аргумент, возвращает число типа Float64, близкое к 2 в степени x.
Принимает числовой аргумент, возвращает число типа Float64, близкое к двоичному логарифму от аргумента.
Принимает числовой аргумент, возвращает число типа Float64, близкое к 10 в степени x.
Принимает числовой аргумент, возвращает число типа Float64, близкое к десятичному логарифму от аргумента.
Принимает числовой аргумент, возвращает число типа Float64, близкое к квадратному корню от аргумента.
Принимает числовой аргумент, возвращает число типа Float64, близкое к кубическому корню от аргумента.
Если x неотрицательно, то erf(x / σ√2) - вероятность того, что случайная величина, имеющая нормальное распределение со среднеквадратичным отклонением σ, принимает значение, отстоящее от мат. ожидания больше чем на x.
Пример (правило трёх сигм):
SELECT erf(3 / sqrt(2))
┌─erf(divide(3, sqrt(2)))─┐
│ 0.9973002039367398 │
└───────────────────────────┘
Принимает числовой аргумент, возвращает число типа Float64, близкое к 1 - erf(x), но без потери точности для больших x.
Логарифм от гамма функции.
Гамма функция.
Синус.
Косинус.
Тангенс.
Арксинус.
Арккосинус.
Арктангенс.
Принимает два числовых аргумента x и y. Возвращает число типа Float64, близкое к x в степени y.
Синтаксис:
cosh(x)
Параметры:
Возвращаемое значение:
Тип: Float64.
Пример:
Запрос:
SELECT cosh(0);
Результат:
┌─cosh(0)──┐
│ 1 │
└───────────┘
Обратный гиперболический косинус.
Синтаксис:
acosh(x)
Параметры:
Возвращаемое значение:
Тип: Float64.
Пример:
Запрос:
SELECT acosh(1);
Результат:
┌─acosh(1)─┐
│ 0 │
└───────────┘
Смотрите также:
Синтаксис:
sinh(x)
Параметры:
Возвращаемое значение:
Тип: Float64.
Пример:
Запрос:
SELECT sinh(0);
Результат:
┌─sinh(0)──┐
│ 0 │
└───────────┘
Обратный гиперболический синус.
Синтаксис:
asinh(x)
Параметры:
Возвращаемое значение:
Тип: Float64.
Пример:
Запрос:
SELECT asinh(0);
Результат:
┌─asinh(0)─┐
│ 0 │
└───────────┘
Смотрите также:
Обратный гиперболический тангенс.
Синтаксис:
atanh(x)
Параметры:
Возвращаемое значение:
Тип: Float64.
Пример:
Запрос:
SELECT atanh(0);
Результат:
┌─atanh(0)─┐
│ 0 │
└───────────┘
Функция вычисляет угол в радианах между положительной осью x и линией, проведенной из начала координат в точку (x, y) ≠ (0, 0).
Синтаксис:
atan2(y, x)
Параметры:
Возвращаемое значение:
Тип: Float64.
Пример:
Запрос:
SELECT atan2(1, 1);
Результат:
┌────────atan2(1, 1)─┐
│ 0.7853981633974483 │
└──────────────────────┘
Вычисляет длину гипотенузы прямоугольного треугольника. При использовании этой функции не возникает проблем при возведении в квадрат очень больших или очень малых чисел.
Синтаксис:
hypot(x, y)
Параметры:
Возвращаемое значение:
Тип: Float64.
Пример:
Запрос:
SELECT hypot(1, 1);
Результат:
┌─────────hypot(1, 1)─┐
│ 1.4142135623730951 │
└──────────────────────┘
Вычисляет log(1+x). Функция log1p(x) является более точной, чем функция log(1+x) для малых значений x.
Синтаксис:
log1p(x)
Параметры:
Возвращаемое значение:
Тип: Float64.
Пример:
Запрос:
SELECT log1p(0);
Результат:
┌─log1p(0)─┐
│ 0 │
└───────────┘
Смотрите также:
Возвращает наибольшее круглое число, которое меньше или равно, чем x.
Круглым называется число, кратное 1 / 10N или ближайшее к нему число соответствующего типа данных, если 1 / 10N не представимо точно.
N – целочисленная константа, не обязательный параметр. По умолчанию – ноль, что означает – округлять до целого числа.
N может быть отрицательным.
Примеры: floor(123.45, 1) = 123.4, floor(123.45, -1) = 120.
x - любой числовой тип. Результат - число того же типа.
Для целочисленных аргументов имеет смысл округление с отрицательным значением N (для неотрицательных N, функция ничего не делает).
В случае переполнения при округлении (например, floor(-128, -1)), возвращается implementation specific результат.
Возвращает наименьшее круглое число, которое больше или равно, чем x.
В остальном, аналогично функции floor, см. выше.
Округляет значение до указанного десятичного разряда.
Функция возвращает ближайшее значение указанного порядка. В случае, когда заданное число равноудалено от чисел необходимого порядка, функция возвращает то из них, которое имеет ближайшую чётную цифру (банковское округление).
Синтаксис:
round(expression [, decimal_places])
Параметры:
Возвращаемое значение:
Округлённое значение того же типа, что и входящее.
Примеры:
Пример использования:
SELECT number / 2 AS x, round(x) FROM system.numbers LIMIT 3
┌───x─┬─round(divide(number, 2))─┐
│ 0 │ 0 │
│ 0.5 │ 0 │
│ 1 │ 1 │
└─────┴─────────────────────────────┘
Примеры округления:
Округление до ближайшего числа.
round(3.2, 0) = 3
round(4.1267, 2) = 4.13
round(22,-1) = 20
round(467,-2) = 500
round(-467,-2) = -500
Банковское округление.
round(3.5) = 4
round(4.5) = 4
round(3.55, 1) = 3.6
round(3.65, 1) = 3.6
Смотрите также:
Округляет число до указанного десятичного разряда.
Банковское округление (англ. banker's rounding) – метод округления дробных чисел. Если округляемое число равноудалено от соседних чисел, то оно округляется до ближайшей чётной цифры заданного десятичного разряда. К примеру, 3,5 округляется до 4, а 2,5 до 2.
Этот метод округления, используемый по умолчанию для чисел с плавающей запятой, определён в стандарте [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754#Roundings_to_nearest). Функция [round](#rounding_functions-round) также округляет числа с плавающей запятой по этому методу. Функция `roundBankers` округляет не только числа с плавающей запятой, но и целые числа методом банковского округления, например, `roundBankers(45, -1) = 40`.
В других случаях функция округляет к ближайшему целому.
Банковское округление позволяет уменьшить влияние округления чисел на результат суммирования или вычитания этих чисел.
Пример суммирования чисел 1.5, 2.5, 3.5 и 4.5 с различным округлением:
Синтаксис:
roundBankers(expression [, decimal_places])
Параметры:
Возвращаемое значение:
Пример использования:
Запрос:
SELECT number / 2 AS x, roundBankers(x, 0) AS b fROM system.numbers limit 10
Результат:
┌───x─┬─b─┐
│ 0 │ 0 │
│ 0.5 │ 0 │
│ 1 │ 1 │
│ 1.5 │ 2 │
│ 2 │ 2 │
│ 2.5 │ 2 │
│ 3 │ 3 │
│ 3.5 │ 4 │
│ 4 │ 4 │
│ 4.5 │ 4 │
└─────┴────┘
Примеры банковского округления:
roundBankers(0.4) = 0
roundBankers(-3.5) = -4
roundBankers(4.5) = 4
roundBankers(3.55, 1) = 3.6
roundBankers(3.65, 1) = 3.6
roundBankers(10.35, 1) = 10.4
roundBankers(10.755, 2) = 11,76
Смотрите также:
Принимает число. Если число меньше единицы - возвращает 0. Иначе округляет число вниз до ближайшей (целой неотрицательной) степени двух.
Принимает число. Если число меньше единицы - возвращает 0. Иначе округляет число вниз до чисел из набора: 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000. Эта функция специфична и предназначена для реализации отчёта по длительности визита.
Принимает число. Если число меньше 18 - возвращает 0. Иначе округляет число вниз до чисел из набора: 18, 25, 35, 45, 55. Эта функция специфична и предназначена для реализации отчёта по возрасту посетителей.
Преобразовывает пары ключ:значение в тип данных Map(key, value).
Синтаксис:
map(key1, value1[, key2, value2, ...])
Параметры:
Возвращаемое значение:
Тип: Map(key, value).
Примеры:
Запрос:
SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);
Результат:
┌─map('key1', number, 'key2', multiply(number, 2))─┐
│ {'key1':0,'key2':0} │
│ {'key1':1,'key2':2} │
│ {'key1':2,'key2':4} │
└──────────────────────────────────────────────────────┘
Запрос:
CREATE TABLE table_map (a Map(String, UInt64)) ENGINE = MergeTree() ORDER BY a;
INSERT INTO table_map SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);
SELECT a['key2'] FROM table_map;
Результат:
┌─arrayElement(a, 'key2')─┐
│ 0 │
│ 2 │
│ 4 │
└───────────────────────────┘
См. также
Собирает все ключи и суммирует соответствующие значения.
Синтаксис:
mapAdd(Tuple(Array, Array), Tuple(Array, Array) [, ...])
Параметры
Аргументами являются кортежи из двух массивов, где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа.
Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу (Int64, UInt64 или Float64).
Общий приведенный тип используется в качестве типа для результирующего массива.
Возвращаемое значение:
Пример:
Запрос:
SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTypeName(res) as type;
Результат:
┌─res────────────┬─type──────────────────────────────────┐
│ ([1,2],[2,2]) │ Tuple(Array(UInt8), Array(UInt64)) │
└────────────────┴────────────────────────────────────────┘
Собирает все ключи и вычитает соответствующие значения.
Синтаксис:
mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...])
Параметры:
Аргументами являются кортежи из двух массивов, где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа.
Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу (Int64, UInt64 или Float64).
Общий приведенный тип используется в качестве типа для результирующего массива.
Возвращаемое значение:
Пример:
Запрос:
SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1])) as res, toTypeName(res) as type;
Результат:
┌─res─────────────┬─type─────────────────────────────────┐
│ ([1,2],[-1,0]) │ Tuple(Array(UInt8), Array(Int64)) │
└─────────────────┴───────────────────────────────────────┘
Заполняет недостающие ключи в контейнере map (пара массивов ключей и значений), где ключи являются целыми числами. Кроме того, он поддерживает указание максимального ключа, который используется для расширения массива ключей.
Синтаксис:
mapPopulateSeries(keys, values[, max])
Генерирует контейнер map, где ключи - это серия чисел, от минимального до максимального ключа (или аргумент max, если он указан), взятых из массива keys с размером шага один, и соответствующие значения, взятые из массива values. Если значение не указано для ключа, то в результирующем контейнере используется значение по умолчанию.
Количество элементов в keys и values должно быть одинаковым для каждой строки.
Параметры:
Возвращаемое значение:
Пример:
Запрос:
select mapPopulateSeries([1,2,4], [11,22,44], 5) as res, toTypeName(res) as type;
Результат:
┌─res────────────────────────────┬─type─────────────────────────────────┐
│ ([1,2,3,4,5],[11,22,0,44,0]) │ Tuple(Array(UInt8), Array(UInt8)) │
└────────────────────────────────┴───────────────────────────────────────┘
Определяет, содержит ли контейнер map ключ key.
Синтаксис:
mapContains(map, key)
Параметры:
Возвращаемое значение:
Тип: UInt8.
Пример:
Запрос:
CREATE TABLE test (a Map(String,String)) ENGINE = Memory;
INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapContains(a, 'name') FROM test;
Результат:
┌─mapContains(a, 'name')─┐
│ 1 │
│ 0 │
└──────────────────────────┘
Возвращает все ключи контейнера map.
Синтаксис:
mapKeys(map)
Параметры
Возвращаемое значение
Тип: Array.
Пример:
Запрос:
CREATE TABLE test (a Map(String,String)) ENGINE = Memory;
INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapKeys(a) FROM test;
Результат:
┌─mapKeys(a)─────────────┐
│ ['name','age'] │
│ ['number','position'] │
└─────────────────────────┘
Возвращает все значения контейнера map.
Синтаксис:
mapKeys(map)
Параметры:
Возвращаемое значение:
Тип: Array.
Примеры:
Запрос:
CREATE TABLE test (a Map(String,String)) ENGINE = Memory;
INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapValues(a) FROM test;
Результат:
┌─mapValues(a)─────┐
│ ['eleven','11'] │
│ ['twelve','6.0'] │
└───────────────────┘
Разбивает строку на подстроки, используя в качестве разделителя separator.
separator должен быть константной строкой из ровно одного символа.
Возвращается массив выделенных подстрок. Могут выделяться пустые подстроки, если разделитель идёт в начале или в конце строки, или если идёт более одного разделителя подряд.
Синтаксис:
splitByChar(<separator>, <s>)
Параметры:
Возвращаемые значения:
Возвращает массив подстрок. Пустая подстрока, может быть возвращена, когда:
Тип: Массив строк.
Пример:
SELECT splitByChar(',', '1,2,3,abcde')
┌─splitByChar(',', '1,2,3,abcde')─┐
│ ['1','2','3','abcde'] │
└────────────────────────────────────┘
Разбивает строку на подстроки, разделенные строкой. В качестве разделителя использует константную строку separator, которая может состоять из нескольких символов. Если строка separator пуста, то функция разделит строку s на массив из символов.
Синтаксис:
splitByString(separator, s)
Параметры:
Возвращаемые значения:
Возвращает массив подстрок. Пустая подстрока, может быть возвращена, когда:
Тип: Массив строк.
Примеры:
SELECT splitByString(', ', '1, 2 3, 4,5, abcde')
┌─splitByString(', ', '1, 2 3, 4,5, abcde')─┐
│ ['1','2 3','4,5','abcde'] │
└───────────────────────────────────────────────┘
SELECT splitByString('', 'abcde')
┌─splitByString('', 'abcde')─┐
│ ['a','b','c','d','e'] │
└──────────────────────────────┘
Склеивает строки, перечисленные в массиве, с разделителем separator.
separator – необязательный параметр, константная строка, по умолчанию равен пустой строке.
Возвращается строка.
Выделяет подстроки из подряд идущих байт из диапазонов a-z и A-Z.
Возвращается массив выделенных подстрок.
Пример:
SELECT alphaTokens('abca1abc')
┌─alphaTokens('abca1abc')─┐
│ ['abca','abc'] │
└───────────────────────────┘
Битовые функции работают для любой пары типов из UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64.
Тип результата – целое число, битность которого равна максимальной битности аргументов. Если хотя бы один аргумент знаковый, то результат – знаковое число. Если аргумент – число с плавающей запятой - оно приводится к Int64.
Принимает любое целое число и конвертирует его в двоичное число, возвращает значение бита в указанной позиции. Отсчет начинается с 0 справа налево.
Синтаксис:
SELECT bitTest(number, index)
Параметры:
Возвращаемое значение:
Тип: UInt8.
Пример:
Например, число 43 в двоичной системе счисления равно: 101011.
Запрос:
SELECT bitTest(43, 1)
Ответ:
┌─bitTest(43, 1)─┐
│ 1 │
└─────────────────┘
Другой пример:
Запрос:
SELECT bitTest(43, 2)
Ответ:
┌─bitTest(43, 2)─┐
│ 0 │
└─────────────────┘
Возвращает результат логической конъюнкции (оператор AND) всех битов в указанных позициях. Отсчет начинается с 0 справа налево.
Бинарная конъюнкция:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Синтаксис:
SELECT bitTestAll(number, index1, index2, index3, index4, ...)
Параметры:
Возвращаемое значение:
Тип: UInt8.
Пример:
Например, число 43 в двоичной системе счисления равно: 101011.
Запрос:
SELECT bitTestAll(43, 0, 1, 3, 5)
Ответ:
┌─bitTestAll(43, 0, 1, 3, 5)─┐
│ 1 │
└──────────────────────────────┘
Другой пример:
Запрос:
SELECT bitTestAll(43, 0, 1, 3, 5, 2)
Ответ:
┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
│ 0 │
└──────────────────────────────────┘
Возвращает результат логической дизъюнкции (оператор OR) всех битов в указанных позициях. Отсчет начинается с 0 справа налево.
Бинарная дизъюнкция:
Синтаксис:
SELECT bitTestAny(number, index1, index2, index3, index4, ...)
Параметры:
Возвращаемое значение:
Тип: UInt8.
Пример:
Например, число 43 в двоичной системе счисления равно: 101011.
Запрос:
SELECT bitTestAny(43, 0, 2)
Ответ:
┌─bitTestAny(43, 0, 2)─┐
│ 1 │
└────────────────────────┘
Другой пример:
Запрос:
SELECT bitTestAny(43, 4, 2)
Ответ:
┌─bitTestAny(43, 4, 2)─┐
│ 0 │
└────────────────────────┘
Подсчитывает количество равных единице битв числе.
Синтаксис:
bitCount(x)
Параметры:
Возвращаемое значение:
Функция не преобразует входное значение в более крупный тип (sign extension). Поэтому, например, bitCount(toUInt8(-1)) = 8.
Тип: UInt8.
Пример:
Возьмём к примеру число 333. Его бинарное представление – 0000000101001101.
Запрос:
SELECT bitCount(333)
Результат:
┌─bitCount(100)─┐
│ 5 │
└────────────────┘
Создаёт битовый массив из массива целочисленных значений.
Синтаксис:
bitmapBuild(array)
Параметры:
Пример:
SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res, toTypeName(res)
┌─res──┬─toTypeName(bitmapBuild([1, 2, 3, 4, 5]))─────┐
│ │ AggregateFunction(groupBitmap, UInt8) │
└──────┴──────────────────────────────────────────────────┘
Преобразует битовый массив в массив целочисленных значений.
Синтаксис:
bitmapToArray(bitmap)
Параметры:
Пример:
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res
┌─res──────────┐
│ [1,2,3,4,5] │
└──────────────┘
Создает подмножество битмапа с n элементами, расположенными между range_start и cardinality_limit.
Синтаксис:
bitmapSubsetLimit(bitmap, range_start, cardinality_limit)
Параметры:
Возвращаемое значение:
Тип: Bitmap object.
Пример:
Запрос:
SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res
Ответ:
┌─res─────────────────────────┐
│ [30,31,32,33,100,200,500] │
└─────────────────────────────┘
Проверяет вхождение элемента в битовый массив.
Синтаксис:
bitmapContains(haystack, needle)
Параметры:
Возвращаемые значения:
Тип – UInt8.
Пример:
SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res
┌─res─┐
│ 1 │
└─────┘
Проверяет, имеют ли два битовых массива хотя бы один общий элемент.
Синтаксис:
bitmapHasAny(bitmap1, bitmap2)
Если вы уверены, что bitmap2 содержит строго один элемент, используйте функцию bitmapContains. Она работает эффективнее.
Параметры:
Возвращаемые значения:
Пример:
SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
┌─res─┐
│ 1 │
└─────┘
Аналогично функции hasAll(array, array) возвращает 1 если первый битовый массив содержит все элементы второго, 0 в противном случае.
Если второй аргумент является пустым битовым массивом, то возвращает 1.
Синтаксис:
bitmapHasAll(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
┌─res─┐
│ 0 │
└─────┘
Логическое И для двух битовых массивов. Результат – новый битовый массив.
Синтаксис:
bitmapAnd(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
┌─res─┐
│ [3] │
└─────┘
Логическое ИЛИ для двух битовых массивов. Результат – новый битовый массив.
Синтаксис:
bitmapOr(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
┌─res────────┐
│ [1,2,4,5] │
└────────────┘
Логическое исключающее ИЛИ для двух битовых массивов. Результат – новый битовый массив.
Синтаксис:
bitmapXor(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
┌─res────────┐
│ [1,2,4,5] │
└────────────┘
Логическое отрицание И для двух битовых массивов. Результат – новый битовый массив.
Синтаксис:
bitmapAndnot(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
┌─res────┐
│ [1,2] │
└────────┘
Возвращает кардинальность битового массива в виде значения типа UInt64.
Синтаксис:
bitmapCardinality(bitmap)
Параметры:
Пример:
SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res
┌─res─┐
│ 5 │
└─────┘
Выполняет логическое И и возвращает кардинальность (UInt64) результирующего битового массива.
Синтаксис:
bitmapAndCardinality(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
┌─res─┐
│ 1 │
└─────┘
Выполняет логическое ИЛИ и возвращает кардинальность (UInt64) результирующего битового массива.
Синтаксис:
bitmapOrCardinality(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
┌─res─┐
│ 5 │
└─────┘
Выполняет логическое исключающее ИЛИ и возвращает кардинальность (UInt64) результирующего битового массива.
Синтаксис:
bitmapXorCardinality(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
┌─res─┐
│ 4 │
└─────┘
Выполняет логическое отрицание И и возвращает кардинальность (UInt64) результирующего битового массива.
Синтаксис:
bitmapAndnotCardinality(bitmap,bitmap)
Параметры:
Пример:
SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
┌─res─┐
│ 2 │
└─────┘
Функции хэширования могут использоваться для детерминированного псевдослучайного разбрасывания элементов.
Интерпретирует все входные параметры как строки и вычисляет хэш MD5 для каждой из них. Затем объединяет хэши, берет первые 8 байт хэша результирующей строки и интерпретирует их как значение типа UInt64 с big-endian порядком байтов.
Синтаксис:
halfMD5(par1, ...)
Функция относительно медленная (5 миллионов коротких строк в секунду на ядро процессора).
По возможности, используйте функцию sipHash64 вместо неё.
Параметры:
Возвращаемое значение:
Пример:
SELECT halfMD5(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS halfMD5hash, toTypeName(halfMD5hash) AS type
┌────────halfMD5hash──┬─type───┐
│ 186182704141653334 │ UInt64 │
└──────────────────────┴────────┘
Вычисляет MD5 от строки и возвращает полученный набор байт в виде FixedString(16).
Если вам не нужен конкретно MD5, а нужен неплохой криптографический 128-битный хэш, то используйте вместо этого функцию sipHash128.
Если вы хотите получить такой же результат, как выдаёт утилита md5sum, напишите lower(hex(MD5(s))).
Генерирует 64-х битное значение SipHash.
Синтаксис:
sipHash64(par1,...)
Это криптографическая хэш-функция. Она работает по крайней мере в три раза быстрее, чем функция MD5.
Функция интерпретирует все входные параметры как строки и вычисляет хэш MD5 для каждой из них. Затем комбинирует хэши по следующему алгоритму.
Параметры:
Возвращаемое значение:
Пример:
SELECT sipHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS SipHash, toTypeName(SipHash) AS type
┌────────────────SipHash─┬─type───┐
│ 13726873534472839665 │ UInt64 │
└─────────────────────────┴────────┘
Вычисляет SipHash от строки.
Принимает аргумент типа String. Возвращает FixedString(16).
Отличается от sipHash64 тем, что финальный xor-folding состояния делается только до 128 бит.
Генерирует 64-х битное значение CityHash.
Синтаксис:
cityHash64(par1,...)
Это не криптографическая хэш-функция. Она использует CityHash алгоритм для строковых параметров и зависящую от реализации быструю некриптографическую хэш-функцию для параметров с другими типами данных. Функция использует комбинатор CityHash для получения конечных результатов.
Параметры:
Возвращаемое значение:
Примеры:
Пример вызова:
SELECT cityHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS CityHash, toTypeName(CityHash) AS type
┌───────────────CityHash─┬─type───┐
│ 12072650598913549138 │ UInt64 │
└────────────────────────┴─────────┘
А вот так вы можете вычислить чексумму всей таблицы с точностью до порядка строк:
SELECT groupBitXor(cityHash64(*)) FROM table
Вычисляет 32-битный хэш-код от целого числа любого типа.
Это сравнительно быстрая не криптографическая хэш-функция среднего качества для чисел.
Вычисляет 64-битный хэш-код от целого числа любого типа.
Работает быстрее, чем intHash32. Качество среднее.
Вычисляет SHA-1, SHA-224, SHA-256 от строки и возвращает полученный набор байт в виде FixedString(20), FixedString(28), FixedString(32).
Функция работает достаточно медленно (SHA-1 - примерно 5 миллионов коротких строк в секунду на одном процессорном ядре, SHA-224 и SHA-256 - примерно 2.2 миллионов).
Рекомендуется использовать эти функции лишь в тех случаях, когда вам нужна конкретная хэш-функция и вы не можете её выбрать.
Даже в этих случаях, рекомендуется применять функцию оффлайн - заранее вычисляя значения при вставке в таблицу, вместо того, чтобы применять её при SELECT-ах.
Быстрая не криптографическая хэш-функция неплохого качества для строки, полученной из URL путём некоторой нормализации.
URLHash(s) – вычислить хэш от строки без одного завершающего символа /, ? или # на конце, если там такой есть.
URLHash(s, N) – вычислить хэш от строки до N-го уровня в иерархии URL, без одного завершающего символа /, ? или # на конце, если там такой есть.
Уровни аналогичные URLHierarchy.
Создает 64-битное значение FarmHash, независимое от платформы (архитектуры сервера), что важно, если значения сохраняются или используются для разбиения данных на группы.
Синтаксис:
farmFingerprint64(par1, ...)
farmHash64(par1, ...)
Эти функции используют методы Fingerprint64 и Hash64 из всех доступных методов.
Параметры:
Возвращаемое значение:
Пример:
SELECT farmHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS FarmHash, toTypeName(FarmHash) AS type
┌───────────────FarmHash─┬─type───┐
│ 17790458267262532859 │ UInt64 │
└────────────────────────┴─────────┘
Вычисляет JavaHash от строки. JavaHash не отличается ни скоростью, ни качеством, поэтому эту функцию следует считать устаревшей. Используйте эту функцию, если вам необходимо получить значение хэша по такому же алгоритму.
Синтаксис:
SELECT javaHash('');
Возвращаемое значение:
Тип: javaHash.
Пример:
Запрос:
SELECT javaHash('Hello, world!');
Ответ:
┌─javaHash('Hello, world!')─┐
│ -1880044555 │
└─────────────────────────────┘
Вычисляет JavaHash от строки, при допущении, что строка представлена в кодировке UTF-16LE.
Синтаксис:
javaHashUTF16LE(stringUtf16le)
Параметры:
Возвращаемое значение:
Тип: javaHash.
Пример:
Верный запрос для строки, кодированной в UTF-16LE.
Запрос:
SELECT javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le'))
Ответ:
┌─javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le'))─┐
│ 3556498 │
└────────────────────────────────────────────────────────────────────┘
Вычисляет HiveHash от строки.
Синтаксис:
SELECT hiveHash('');
HiveHash – это результат JavaHash с обнулённым битом знака числа. Функция используется в Apache Hive вплоть до версии 3.0.
Возвращаемое значение:
Хэш-значение типа Int32.
Тип: hiveHash.
Пример:
Запрос:
SELECT hiveHash('Hello, world!');
Ответ:
┌─hiveHash('Hello, world!')─┐
│ 267439093 │
└─────────────────────────────┘
Генерирует 64-х битное значение MetroHash.
Синтаксис:
metroHash64(par1, ...)
Параметры
Функция принимает переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.
Возвращаемое значение:
Пример:
SELECT metroHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MetroHash, toTypeName(MetroHash) AS type
┌─────────────MetroHash─┬─type────┐
│ 14235658766382344533 │ UInt64 │
└────────────────────────┴─────────┘
Вычисляет JumpConsistentHash от значения типа UInt64.
Имеет два параметра: ключ типа UInt64 и количество бакетов. Возвращает значение типа Int32.
Дополнительные сведения смотрите по ссылке: JumpConsistentHash
Генерирует значение MurmurHash2.
Синтаксис:
murmurHash2_32(par1, ...)
murmurHash2_64(par1, ...)
Параметры:
Обе функции принимают переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.
Возвращаемое значение:
Пример:
SELECT murmurHash2_64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash2, toTypeName(MurmurHash2) AS type
┌───────────MurmurHash2─┬─type───┐
│ 11832096901709403633 │ UInt64 │
└────────────────────────┴─────────┘
Вычисляет 64-битное значение MurmurHash2, используя те же hash seed, что и gcc.
Синтаксис:
gccMurmurHash(par1, ...);
Параметры:
Возвращаемое значение:
Тип: UInt64.
Примеры:
Запрос:
SELECT
gccMurmurHash(1, 2, 3) AS res1,
gccMurmurHash(('a', [1, 2, 3], 4, (4, ['foo', 'bar'], 1, (1, 2)))) AS res2
Генерирует значение MurmurHash3.
Синтаксис:
murmurHash3_32(par1, ...)
murmurHash3_64(par1, ...)
Параметры:
Обе функции принимают переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.
Возвращаемое значение:
Пример:
SELECT murmurHash3_32(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash3, toTypeName(MurmurHash3) AS type
┌─MurmurHash3─┬─type───┐
│ 2152717 │ UInt32 │
└──────────────┴─────────┘
Генерирует значение MurmurHash3.
Синтаксис:
murmurHash3_128( expr )
Параметры:
Возвращаемое значение:
Пример:
SELECT murmurHash3_128('example_string') AS MurmurHash3, toTypeName(MurmurHash3) AS type
┌─MurmurHash3──────┬─type─────────────┐
│ 6�1�4"S5KT�~~q │ FixedString(16) │
└───────────────────┴──────────────────┘
Вычисляет xxHash от строки. Предлагается в двух вариантах: 32 и 64 бита.
SELECT xxHash32('');
OR
SELECT xxHash64('');
Возвращаемое значение:
Тип: xxHash.
Пример:
Запрос:
SELECT xxHash32('Hello, world!');
Ответ:
┌─xxHash32('Hello, world!')─┐
│ 834093149 │
└─────────────────────────────┘
Смотрите также:
Используются не криптографические генераторы псевдослучайных чисел.
Все функции принимают ноль аргументов или один аргумент.
В случае, если передан аргумент – он может быть любого типа, и его значение никак не используется.
Этот аргумент нужен только для того, чтобы предотвратить склейку одинаковых выражений – чтобы две разные записи одной функции возвращали разные столбцы, с разными случайными числами.
Возвращает псевдослучайное число типа UInt32, равномерно распределённое среди всех чисел типа UInt32.
Используется linear congruential generator.
Возвращает псевдослучайное число типа UInt64, равномерно распределённое среди всех чисел типа UInt64.
Используется linear congruential generator.
Создает константный столбец с псевдослучайным значением.
Синтаксис:
randConstant([x])
Параметры:
Возвращаемое значение:
Тип: UInt32.
Пример:
Запрос:
SELECT rand(), rand(1), rand(number), randConstant(), randConstant(1), randConstant(number)
FROM numbers(3)
Результат:
┌─────rand()─┬────rand(1)──┬─rand(number)─┬─randConstant()─┬─randConstant(1)─┬─randConstant(number)─┐
│ 3047369878 │ 4132449925 │ 4044508545 │ 2740811946 │ 4229401477 │ 1924032898 │
│ 2938880146 │ 1267722397 │ 4154983056 │ 2740811946 │ 4229401477 │ 1924032898 │
│ 956619638 │ 4238287282 │ 1104342490 │ 2740811946 │ 4229401477 │ 1924032898 │
└─────────────┴─────────────┴───────────────┴──────────────────┴───────────────────┴───────────────────────┘
Синтаксис:
fuzzBits([s], [prob])
Инвертирует каждый бит s с вероятностью prob.
Параметры:
Возвращаемое значение:
Измененная случайным образом строка с тем же типом, что и s.
Пример:
Запрос:
SELECT fuzzBits(materialize('abacaba'), 0.1)
FROM numbers(3)
Результат:
┌─fuzzBits(materialize('abacaba'), 0.1)─┐
│ abaaaja │
│ a*cjab+ │
│ aeca2A │
└──────────────────────────────────────────┘
Возвращает строку, длина которой равна числу переданных аргументов, и каждый байт имеет значение соответствующего аргумента. Принимает несколько числовых аргументов. Если значение аргумента выходит за диапазон UInt8 (0..255), то оно преобразуется в UInt8 с возможным округлением и переполнением.
Синтаксис:
char(number_1, [number_2, ..., number_n]);
Параметры:
Возвращаемое значение:
Тип: String.
Пример:
Запрос:
SELECT char(104.1, 101, 108.9, 108.9, 111) AS hello
Ответ:
┌─hello─┐
│ hello │
└────────┘
Вы можете создать строку в произвольной кодировке, передав соответствующие байты. Пример для UTF-8:
Запрос:
SELECT char(0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82) AS hello;
Ответ:
┌─hello──┐
│ привет │
└─────────┘
Запрос:
SELECT char(0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD) AS hello;
Ответ:
┌─hello─┐
│ 你好 │
└────────┘
Возвращает строку, содержащую шестнадцатеричное представление аргумента.
Синоним: HEX.
Синтаксис:
hex(arg)
Функция использует заглавные буквы A-F и не использует никаких префиксов (например, 0x) или суффиксов (например, h).
Для целочисленных аргументов он печатает шестнадцатеричные цифры («nibbles») от наиболее значимого до наименее значимого (big endian или «читаемый человеком» порядок). Он начинается с самого значимого ненулевого байта (начальные нулевые байты опущены), но всегда печатает обе цифры каждого байта, даже если начальная цифра равна нулю.
Пример:
Запрос:
SELECT hex(1);
Результат:
01
Значения типов Date and DateTime форматируются как соответствующие целые числа (количество дней с момента эпохи для Даты и значение временной метки Unix для даты и времени).
Для String and FixedString, все байты просто кодируются как два шестнадцатеричных числа. Нулевые байты не пропущены.
Значения типов с плавающей запятой и десятичной дробью кодируются как их представление в памяти. Поскольку мы поддерживаем архитектуру little endian, они кодируются в little endian. Нулевые начальные/конечные байты не опущены.
Параметры:
Возвращаемое значение:
Type: String.
Пример:
Запрос:
SELECT hex(toFloat32(number)) as hex_presentation FROM numbers(15, 2);
Результат:
┌─hex_presentation─┐
│ 00007041 │
│ 00008041 │
└───────────────────┘
Запрос:
SELECT hex(toFloat64(number)) as hex_presentation FROM numbers(15, 2);
Result:
┌─hex_presentation─┐
│ 0000000000002E40 │
│ 0000000000003040 │
└───────────────────┘
Принимает строку, содержащую любое количество шестнадцатеричных цифр, и возвращает строку, содержащую соответствующие байты. Поддерживает как прописные, так и строчные буквы A-F. Число шестнадцатеричных цифр не обязательно должно быть четным. Если он нечетный, то последняя цифра интерпретируется как наименее значимая половина байта 00-0F. Если строка аргумента содержит что-либо, кроме шестнадцатеричных цифр, возвращается некоторый результат, определенный реализацией (исключение не генерируется).
Если вы хотите преобразовать результат в число, вы можете использовать функции "reverse" и ‘reinterpretAsType’.
Принимает строку, содержащую 36 символов в формате 123e4567-e89b-12d3-a456-426655440000, и возвращает в виде набора байт в FixedString(16).
Принимает значение типа FixedString(16). Возвращает строку из 36 символов в текстовом виде.
Принимает целое число. Возвращает строку, содержащую список степеней двойки, в сумме дающих исходное число; по возрастанию, в текстовом виде, через запятую, без пробелов.
Принимает целое число. Возвращает массив чисел типа UInt64, содержащий степени двойки, в сумме дающих исходное число; числа в массиве идут по возрастанию.
Генерирует идентификатор UUID версии 4.
Синтаксис:
generateUUIDv4()
Возвращаемое значение:
Пример использования:
Этот пример демонстрирует, как создать таблицу с UUID-колонкой и добавить в нее сгенерированный UUID.
CREATE TABLE t_uuid (x UUID) ENGINE=TinyLog
INSERT INTO t_uuid SELECT generateUUIDv4()
SELECT * FROM t_uuid
┌───────────────────────────────────────x─┐
│ f4bf890f-f9dc-4332-ad5c-0c18e73f28e9 │
└─────────────────────────────────────────┘
Преобразует значение типа String в тип UUID.
Синтаксис:/Документация/RT_WideStore/RT_WideStore_UG_Attachment_4
toUUID(String)
Возвращаемое значение:
Пример использования:
SELECT toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0') AS uuid
┌────────────────────────────────────uuid─┐
│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │
└─────────────────────────────────────────┘
Принимает строку, и пытается преобразовать в тип UUID. При неудаче возвращает NULL.
Синтаксис:
toUUIDOrNull(String)
Возвращаемое значение:
Пример использования:
SELECT toUUIDOrNull('61f0c404-5cb3-11e7-907b-a6006ad3dba0T') AS uuid
┌─uuid─┐
│ ᴺᵁᴸᴸ │
└──────┘
Принимает строку, и пытается преобразовать в тип UUID. При неудаче возвращает нулевой UUID.
Синтаксис:
toUUIDOrZero(String)
Возвращаемое значение:
Пример использования
SELECT toUUIDOrZero('61f0c404-5cb3-11e7-907b-a6006ad3dba0T') AS uuid
┌────────────────────────────────────uuid─┐
│ 00000000-0000-0000-0000-000000000000 │
└─────────────────────────────────────────┘
Принимает строку, содержащую 36 символов в формате xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, и возвращает в виде набора байт в FixedString(16).
Синтаксис:
UUIDStringToNum(String)
Возвращаемое значение:
FixedString(16)
Пример использования:
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid) AS bytes
┌─uuid────────────────────────────────────┬─bytes─────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└─────────────────────────────────────────┴────────────────────┘
Принимает значение типа FixedString(16). Возвращает строку из 36 символов в текстовом виде.
Синтаксис:
UUIDNumToString(FixedString(16))
Возвращаемое значение:
Пример использования:
SELECT
'a/<@];!~p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16)) AS uuid
┌─bytes─────────────┬─uuid────────────────────────────────────┐
│ a/<@];!~p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└────────────────────┴─────────────────────────────────────────┘
См. также:
Все функции работают не по RFC - то есть, максимально упрощены ради производительности.
Если в URL-е нет ничего похожего, то возвращается пустая строка.
protocol:
domain:
Синтаксис:
domain(url)
Параметры:
URL может быть указан со схемой или без неё. Примеры:
svn+ssh://some.svn-hosting.com:80/repo/trunk
some.svn-hosting.com:80/repo/trunk
Для указанных примеров функция domain возвращает следующие результаты:
some.svn-hosting.com
some.svn-hosting.com
Возвращаемые значения:
Тип – String.
Пример:
SELECT domain('svn+ssh://some.svn-hosting.com:80/repo/trunk')
┌─domain('svn+ssh://some.svn-hosting.com:80/repo/trunk')─┐
│ some.svn-hosting.com │
└─────────────────────────────────────────────────────────────┘
Возвращает домен, удалив префикс ‘www.’, если он присутствовал.
topLevelDomain
Извлекает домен верхнего уровня из URL.
Синтаксис:
topLevelDomain(url)
Параметры:
URL может быть указан со схемой или без неё. Примеры:
svn+ssh://some.svn-hosting.com:80/repo/trunk
some.svn-hosting.com:80/repo/trunk
Возвращаемые значения:
Тип – String.
Пример:
SELECT topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk')
┌─topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk')─┐
│ com │
└──────────────────────────────────────────────────────────────────────────┘
Возвращает «первый существенный поддомен». Первый существенный поддомен – это домен второго уровня, если он не равен одному из com, net, org, co, или домен третьего уровня, иначе. Например, firstSignificantSubdomain(‘https://widestore.rt.ru/’) = ‘rt’, firstSignificantSubdomain(‘https://news.rt.com.tr/’) = ‘rt’. Список «несущественных» доменов второго уровня и другие детали реализации могут изменяться в будущем.
Возвращает часть домена, включающую поддомены верхнего уровня до «первого существенного поддомена» (см. выше).
Например, cutToFirstSignificantSubdomain('https://widestore.rt.com.tr/') = 'rt.com.tr'.
Возвращает часть домена, включающую поддомены верхнего уровня до первого существенного поддомена. Принимает имя пользовательского списка доменов верхнего уровня.
Полезно, если требуется актуальный список доменов верхнего уровня или если есть пользовательский.
Пример конфигурации:
<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
<!-- https://publicsuffix.org/list/public_suffix_list.dat -->
<public_suffix_list>public_suffix_list.dat</public_suffix_list>
<!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>
Синтаксис:
cutToFirstSignificantSubdomain(URL, TLD)
Параметры:
Возвращаемое значение:
Тип: String.
Пример:
Запрос:
SELECT cutToFirstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list');
Результат:
┌─cutToFirstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐
│ foo.there-is-no-such-domain │
└────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Смотрите также:
Возвращает часть домена, включающую поддомены верхнего уровня до первого существенного поддомена, не опуская "www". Принимает имя пользовательского списка доменов верхнего уровня.
Полезно, если требуется актуальный список доменов верхнего уровня или если есть пользовательский.
Пример конфигурации:
<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
<!-- https://publicsuffix.org/list/public_suffix_list.dat -->
<public_suffix_list>public_suffix_list.dat</public_suffix_list>
<!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>
Синтаксис:
cutToFirstSignificantSubdomainCustomWithWWW(URL, TLD)
Параметры:
Возвращаемое значение:
Тип: String.
Пример:
Запрос:
SELECT cutToFirstSignificantSubdomainCustomWithWWW('www.foo', 'public_suffix_list');
Результат:
┌─cutToFirstSignificantSubdomainCustomWithWWW('www.foo', 'public_suffix_list')─┐
│ www.foo │
└─────────────────────────────────────────────────────────────────────────────────────┘
Смотрите также:
Возвращает первый существенный поддомен. Принимает имя пользовательского списка доменов верхнего уровня.
Полезно, если требуется актуальный список доменов верхнего уровня или если есть пользовательский.
Пример конфигурации:
<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
<!-- https://publicsuffix.org/list/public_suffix_list.dat -->
<public_suffix_list>public_suffix_list.dat</public_suffix_list>
<!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>
Синтаксис:
firstSignificantSubdomainCustom(URL, TLD)
Параметры:
Возвращаемое значение:
Тип: String.
Пример:
Запрос:
SELECT firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list');
Смотрите также:
Возвращает порт или значение default_port, если в URL-адресе нет порта (или передан невалидный URL)
Возвращает путь. Пример: /top/news.html Путь не включает в себя query string.
То же самое, но включая query string и fragment. Пример: /top/news.html?page=2#comments
Возвращает query-string. Пример: page=1&lr=213. query-string не включает в себя начальный знак вопроса, а также # и всё, что после #.
Возвращает fragment identifier. fragment не включает в себя начальный символ решётки.
Возвращает query string и fragment identifier. Пример: страница=1#29390.
Возвращает значение параметра name в URL, если такой есть; или пустую строку, иначе; если параметров с таким именем много - вернуть первый попавшийся. Функция работает при допущении, что имя параметра закодировано в URL в точности таким же образом, что и в переданном аргументе.
Возвращает массив строк вида name=value, соответствующих параметрам URL. Значения никак не декодируются.
Возвращает массив строк вида name, соответствующих именам параметров URL. Значения никак не декодируются.
Возвращает массив, содержащий URL, обрезанный с конца по символам /, ? в пути и query-string. Подряд идущие символы-разделители считаются за один. Резка производится в позиции после всех подряд идущих символов-разделителей.
То же самое, но без протокола и хоста в результате. Элемент / (корень) не включается. Пример: Функция используется для реализации древовидных отчётов по URL.
URLPathHierarchy('https://example.com/browse/CONV-6788') =
[
'/browse/',
'/browse/CONV-6788'
]
Возвращает декодированный URL.
Пример:
SELECT decodeURLComponent('http://127.0.0.1:8123/?query=SELECT%201%3B') AS DecodedURL;
┌─DecodedURL────────────────────────────────┐
│ http://127.0.0.1:8123/?query=SELECT 1; │
└────────────────────────────────────────────┘
Извлекает сетевую локальность (username:password@host:port) из URL.
Синтаксис:
netloc(URL)
Параметры:
Возвращаемое значение:
Тип: String.
Пример:
Запрос:
SELECT netloc('http://paul@www.example.com:80/');
Результат:
┌─netloc('http://paul@www.example.com:80/')─┐
│ paul@www.example.com:80 │
└───────────────────────────────────────────────┘
Если в URL-е нет ничего похожего, то URL остаётся без изменений.
Удаляет не более одного ‘www.’ с начала домена URL-а, если есть.
Удаляет query string. Знак вопроса тоже удаляется.
Удаляет fragment identifier. Символ решётки тоже удаляется.
Удаляет query string и fragment identifier. Знак вопроса и символ решётки тоже удаляются.
Удаляет параметр URL с именем name, если такой есть. Функция работает при допущении, что имя параметра закодировано в URL в точности таким же образом, что и в переданном аргументе.
Принимает число типа UInt32. Интерпретирует его, как IPv4-адрес в big endian. Возвращает строку, содержащую соответствующий IPv4-адрес в формате A.B.C.D (числа в десятичной форме через точки).
Синоним: INET_NTOA.
Функция, обратная к IPv4NumToString. Если IPv4 адрес в неправильном формате, то возвращает 0.
Синоним: INET_ATON.
Похоже на IPv4NumToString, но вместо последнего октета используется xxx.
Пример:
SELECT
IPv4NumToStringClassC(ClientIP) AS k,
count() AS c
FROM test.hits
GROUP BY k
ORDER BY c DESC
LIMIT 10
┌─k────────────────┬─────c─┐
│ 83.149.9.xxx │ 26238 │
│ 217.118.81.xxx │ 26074 │
│ 213.87.129.xxx │ 25481 │
│ 83.149.8.xxx │ 24984 │
│ 217.118.83.xxx │ 22797 │
│ 78.25.120.xxx │ 22354 │
│ 213.87.131.xxx │ 21285 │
│ 78.25.121.xxx │ 20887 │
│ 188.162.65.xxx │ 19694 │
│ 83.149.48.xxx │ 17406 │
└──────────────────┴───────┘
В связи с тем, что использование xxx весьма необычно, это может быть изменено в дальнейшем. Вам не следует полагаться на конкретный вид этого фрагмента.
Принимает значение типа FixedString(16), содержащее IPv6-адрес в бинарном виде. Возвращает строку, содержащую этот адрес в текстовом виде.
IPv6-mapped IPv4 адреса выводится в формате ::ffff:111.222.33.44.
Примеры: INET6_NTOA.
Примеры:
SELECT IPv6NumToString(toFixedString(unhex('2A0206B8000000000000000000000011'), 16)) AS addr
┌─addr──────────┐
│ 2a02:6b8::11 │
└───────────────┘
SELECT
IPv6NumToString(ClientIP6 AS k),
count() AS c
FROM hits_all
WHERE EventDate = today() AND substring(ClientIP6, 1, 12) != unhex('00000000000000000000FFFF')
GROUP BY k
ORDER BY c DESC
LIMIT 10
┌─IPv6NumToString(ClientIP6)───────────────┬─────c─┐
│ 2a02:2168:aaa:bbbb::2 │ 24695 │
│ 2a02:2698:abcd:abcd:abcd:abcd:8888:5555 │ 22408 │
│ 2a02:6b8:0:fff::ff │ 16389 │
│ 2a01:4f8:111:6666::2 │ 16016 │
│ 2a02:2168:888:222::1 │ 15896 │
│ 2a01:7e00::ffff:ffff:ffff:222 │ 14774 │
│ 2a02:8109:eee:ee:eeee:eeee:eeee:eeee │ 14443 │
│ 2a02:810b:8888:888:8888:8888:8888:8888 │ 14345 │
│ 2a02:6b8:0:444:4444:4444:4444:4444 │ 14279 │
│ 2a01:7e00::ffff:ffff:ffff:ffff │ 13880 │
└─────────────────────────────────────────────┴───────┘
SELECT
IPv6NumToString(ClientIP6 AS k),
count() AS c
FROM hits_all
WHERE EventDate = today()
GROUP BY k
ORDER BY c DESC
LIMIT 10
┌─IPv6NumToString(ClientIP6)─┬───────c─┐
│ ::ffff:94.26.111.111 │ 747440 │
│ ::ffff:37.143.222.4 │ 529483 │
│ ::ffff:5.166.111.99 │ 317707 │
│ ::ffff:46.38.11.77 │ 263086 │
│ ::ffff:79.105.111.111 │ 186611 │
│ ::ffff:93.92.111.88 │ 176773 │
│ ::ffff:84.53.111.33 │ 158709 │
│ ::ffff:217.118.11.22 │ 154004 │
│ ::ffff:217.118.11.33 │ 148449 │
│ ::ffff:217.118.11.44 │ 148243 │
└───────────────────────────────┴────────┘
Функция, обратная к IPv6NumToString. Если IPv6 адрес передан в неправильном формате, то возвращает строку из нулевых байт.
Если IP адрес является корректным IPv4 адресом, функция возвращает его IPv6 эквивалент.
HEX может быть в любом регистре.
Синоним: INET6_ATON.
Синтаксис:
IPv6StringToNum(string)
Аргумент:
Возвращаемое значение:
Тип: FixedString(16).
Пример:
Запрос:
SELECT addr, cutIPv6(IPv6StringToNum(addr), 0, 0) FROM (SELECT ['notaddress', '127.0.0.1', '1111::ffff'] AS addr) ARRAY JOIN addr;
Результат:
┌─addr────────┬─cutIPv6(IPv6StringToNum(addr), 0, 0)─┐
│ notaddress │ :: │
│ 127.0.0.1 │ ::ffff:127.0.0.1 │
│ 1111::ffff │ 1111::ffff │
└─────────────┴──────────────────────────────────────────┘
Смотрите также:
Принимает число типа UInt32. Интерпретирует его, как IPv4-адрес в big endian. Возвращает значение FixedString(16), содержащее адрес IPv6 в двоичном формате.
Пример:
SELECT IPv6NumToString(IPv4ToIPv6(IPv4StringToNum('192.168.0.1'))) AS addr
┌─addr─────────────────┐
│ ::ffff:192.168.0.1 │
└──────────────────────┘
Принимает значение типа FixedString(16), содержащее IPv6-адрес в бинарном виде. Возвращает строку, содержащую адрес из указанного количества байтов, удаленных в текстовом формате. Например:
WITH
IPv6StringToNum('2001:0DB8:AC10:FE01:FEED:BABE:CAFE:F00D') AS ipv6,
IPv4ToIPv6(IPv4StringToNum('192.168.0.1')) AS ipv4
SELECT
cutIPv6(ipv6, 2, 0),
cutIPv6(ipv4, 0, 2)
┌─cutIPv6(ipv6, 2, 0)───────────────────┬─cutIPv6(ipv4, 0, 2)─┐
│ 2001:db8:ac10:fe01:feed:babe:cafe:0 │ ::ffff:192.168.0.0 │
└────────────────────────────────────────┴───────────────────────┘
Принимает на вход IPv4 и значение UInt8, содержащее CIDR. Возвращает кортеж с двумя IPv4, содержащими нижний и более высокий диапазон подсети.
SELECT IPv4CIDRToRange(toIPv4('192.168.5.2'), 16)
┌─IPv4CIDRToRange(toIPv4('192.168.5.2'), 16)─┐
│ ('192.168.0.0','192.168.255.255') │
└────────────────────────────────────────────────┘
Принимает на вход IPv6 и значение UInt8, содержащее CIDR. Возвращает кортеж с двумя IPv6, содержащими нижний и более высокий диапазон подсети.
SELECT IPv6CIDRToRange(toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 32)
┌─IPv6CIDRToRange(toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 32)─┐
│ ('2001:db8::','2001:db8:ffff:ffff:ffff:ffff:ffff:ffff') │
└───────────────────────────────────────────────────────────────────────────────┘
Псевдоним функции IPv4StringToNum() которая принимает строку с адресом IPv4 и возвращает значение типа IPv4, которое равно значению, возвращаемому функцией IPv4StringToNum().
WITH
'171.225.130.45' as IPv4_string
SELECT
toTypeName(IPv4StringToNum(IPv4_string)),
toTypeName(toIPv4(IPv4_string))
┌─toTypeName(IPv4StringToNum(IPv4_string))─┬─toTypeName(toIPv4(IPv4_string))─┐
│ UInt32 │ IPv4 │
└──────────────────────────────────────────────┴────────────────────────────────────┘
WITH
'171.225.130.45' as IPv4_string
SELECT
hex(IPv4StringToNum(IPv4_string)),
hex(toIPv4(IPv4_string))
┌─hex(IPv4StringToNum(IPv4_string))─┬─hex(toIPv4(IPv4_string))─┐
│ ABE1822D │ ABE1822D │
└──────────────────────────────────────┴────────────────────────────┘
Приводит строку с адресом в формате IPv6 к типу IPv6. Возвращает пустое значение, если входящая строка не является корректным IP адресом.
Похоже на функцию IPv6StringToNum, которая представляет адрес IPv6 в двоичном виде.
Если входящая строка содержит корректный IPv4 адрес, функция возвращает его IPv6 эквивалент.
Синтаксис:
toIPv6(string)
Аргумент:
Возвращаемое значение:
Тип: IPv6.
Примеры:
Запрос:
WITH '2001:438:ffff::407d:1bc1' AS IPv6_string
SELECT
hex(IPv6StringToNum(IPv6_string)),
hex(toIPv6(IPv6_string));
Результат:
┌─hex(IPv6StringToNum(IPv6_string))─┬─hex(toIPv6(IPv6_string))──────────┐
│ 20010438FFFF000000000000407D1BC1 │ 20010438FFFF000000000000407D1BC1 │
└──────────────────────────────────────┴─────────────────────────────────────┘
Запрос:
SELECT toIPv6('127.0.0.1');
Результат:
┌─toIPv6('127.0.0.1')─┐
│ ::ffff:127.0.0.1 │
└───────────────────────┘
Определяет, является ли строка адресом IPv4 или нет. Также вернет 0, если string – адрес IPv6.
Синтаксис:
isIPv4String(string)
Параметры:
Возвращаемое значение:
Тип: UInt8.
Примеры:
Запрос:
SELECT addr, isIPv4String(addr) FROM ( SELECT ['0.0.0.0', '127.0.0.1', '::ffff:127.0.0.1'] AS addr ) ARRAY JOIN addr
Результат:
┌─addr──────────────┬─isIPv4String(addr)─┐
│ 0.0.0.0 │ 1 │
│ 127.0.0.1 │ 1 │
│ ::ffff:127.0.0.1 │ 0 │
└────────────────────┴─────────────────────┘
Определяет, является ли строка адресом IPv6 или нет. Также вернет 0, если string – адрес IPv4.
Синтаксис:
isIPv6String(string)
Параметры:
Возвращаемое значение:
Тип: UInt8.
Примеры:
Запрос:
SELECT addr, isIPv6String(addr) FROM ( SELECT ['::', '1111::ffff', '::ffff:127.0.0.1', '127.0.0.1'] AS addr ) ARRAY JOIN addr
Результат:
┌─addr──────────────┬─isIPv6String(addr)─┐
│ :: │ 1 │
│ 1111::ffff │ 1 │
│ ::ffff:127.0.0.1 │ 1 │
│ 127.0.0.1 │ 0 │
└────────────────────┴─────────────────────┘
Информацию о подключении и настройке внешних словарей смотрите в разделе Внешние словари.
Извлекает значение из внешнего словаря.
Синтаксис:
dictGet('dict_name', 'attr_name', id_expr)
dictGetOrDefault('dict_name', 'attr_name', id_expr, default_value_expr)
Параметры:
Возвращаемое значение:
Если значение атрибута не удалось обработать или оно не соответствует типу данных атрибута, то RT.WideStore генерирует исключение.
Пример:
Создадим текстовый файл ext-dict-text.csv со следующим содержимым:
1,1
2,2
Первый столбец – id, второй столбец – c1.
Настройка внешнего словаря:
<widestore>
<dictionary>
<name>ext-dict-test</name>
<source>
<file>
<path>/path-to/ext-dict-test.csv</path>
<format>CSV</format>
</file>
</source>
<layout>
<flat />
</layout>
<structure>
<id>
<name>id</name>
</id>
<attribute>
<name>c1</name>
<type>UInt32</type>
<null_value></null_value>
</attribute>
</structure>
<lifetime>0</lifetime>
</dictionary>
</widestore>
Выполним запрос:
SELECT
dictGetOrDefault('ext-dict-test', 'c1', number + 1, toUInt32(number * 10)) AS val,
toTypeName(val) AS type
FROM system.numbers
LIMIT 3
┌─val─┬─type───┐
│ 1 │ UInt32 │
│ 2 │ UInt32 │
│ 20 │ UInt32 │
└─────┴─────────┘
Смотрите также:
Проверяет, присутствует ли запись с указанным ключом в словаре.
Синтаксис:
dictHas('dict_name', id)
Параметры:
Возвращаемое значение:
Тип – UInt8.
Создаёт массив, содержащий цепочку предков для заданного ключа в иерархическом словаре.
Синтаксис:
dictGetHierarchy('dict_name', key)
Параметры:
Возвращаемое значение:
Type: Array(UInt64).
Проверяет предка ключа по всей иерархической цепочке словаря.
dictIsIn ('dict_name', child_id_expr, ancestor_id_expr)
Параметры:
Возвращаемое значение:
Тип – UInt8.
RT.WideStore поддерживает специализированные функции, которые приводят значения атрибутов словаря к определённому типу данных независимо от конфигурации словаря.
Функции:
Все эти функции можно использовать с модификатором OrDefault. Например, dictGetDateOrDefault.
Синтаксис:
dictGet[Type]('dict_name', 'attr_name', id_expr)
dictGet[Type]OrDefault('dict_name', 'attr_name', id_expr, default_value_expr)
Параметры:
Возвращаемое значение:
Если значение атрибута не удалось обработать или оно не соответствует типу данных атрибута, то RT.WideStore генерирует исключение.
Чтобы указанные ниже функции работали, в конфиге сервера должны быть указаны пути и адреса для получения всех словарей. Словари загружаются при первом вызове любой из этих функций. Если справочники не удаётся загрузить - будет выкинуто исключение.
О том, как создать справочники, смотрите в разделе «Словари».
RT.WideStore поддерживает работу одновременно с несколькими альтернативными геобазами (иерархиями регионов), для того чтобы можно было поддержать разные точки зрения о принадлежности регионов странам.
В конфиге clickhouse-server указывается файл с иерархией регионов:
<path_to_regions_hierarchy_file>/opt/geo/regions_hierarchy.txt</path_to_regions_hierarchy_file>
Кроме указанного файла, рядом ищутся файлы, к имени которых (до расширения) добавлен символ _ и какой угодно суффикс.
Например, также найдётся файл /opt/geo/regions_hierarchy_ua.txt, если такой есть.
ua называется ключом словаря. Для словаря без суффикса, ключ является пустой строкой.
Все словари перезагружаются в рантайме (раз в количество секунд, заданное в конфигурационном параметре builtin_dictionaries_reload_interval, по умолчанию - раз в час), но перечень доступных словарей определяется один раз, при старте сервера.
Во все функции по работе с регионами, в конце добавлен один необязательный аргумент – ключ словаря. Далее он обозначен как geobase.
Пример:
regionToCountry(RegionID) - использует словарь по умолчанию: /opt/geo/regions_hierarchy.txt;
regionToCountry(RegionID, '') - использует словарь по умолчанию: /opt/geo/regions_hierarchy.txt;
regionToCountry(RegionID, 'ua') - использует словарь для ключа ua: /opt/geo/regions_hierarchy_ua.txt;
Принимает число типа UInt32 – идентификатор региона из геобазы. Если регион является городом или входит в некоторый город, то возвращает идентификатор региона – соответствующего города. Иначе возвращает 0.
Переводит регион в область (тип в геобазе – 5). В остальном, аналогично функции regionToCity.
SELECT DISTINCT regionToName(regionToArea(toUInt32(number), 'ua'))
FROM system.numbers
LIMIT 15
┌─regionToName(regionToArea(toUInt32(number), \'ua\'))─┐
│ │
│ Москва и Московская область │
│ Санкт-Петербург и Ленинградская область │
│ Белгородская область │
│ Ивановская область │
│ Калужская область │
│ Костромская область │
│ Курская область │
│ Липецкая область │
│ Орловская область │
│ Рязанская область │
│ Смоленская область │
│ Тамбовская область │
│ Тверская область │
│ Тульская область │
└───────────────────────────────────────────────────────────┘
Переводит регион в федеральный округ (тип в геобазе – 4). В остальном, аналогично функции regionToCity.
SELECT DISTINCT regionToName(regionToDistrict(toUInt32(number), 'ua'))
FROM system.numbers
LIMIT 15
┌─regionToName(regionToDistrict(toUInt32(number), \'ua\'))─┐
│ │
│ Центральный федеральный округ │
│ Северо-Западный федеральный округ │
│ Южный федеральный округ │
│ Северо-Кавказский федеральный округ │
│ Приволжский федеральный округ │
│ Уральский федеральный округ │
│ Сибирский федеральный округ │
│ Дальневосточный федеральный округ │
│ Шотландия │
│ Фарерские острова │
│ Фламандский регион │
│ Брюссельский столичный регион │
│ Валлония │
│ Федерация Боснии и Герцеговины │
└───────────────────────────────────────────────────────────────┘
Переводит регион в страну. В остальном, аналогично функции regionToCity.
Пример: regionToCountry(toUInt32(213)) = 225 – преобразовали Москву (213) в Россию (225).
Переводит регион в континент. В остальном, аналогично функции regionToCity.
Пример: regionToContinent(toUInt32(213)) = 10001 – преобразовали Москву (213) в Евразию (10001).
Находит для региона верхний в иерархии континент.
Синтаксис:
regionToTopContinent(id[, geobase]);
Параметры:
Возвращаемое значение:
Тип: UInt32.
Получает население для региона.
Население может быть прописано в файлах с геобазой. Смотрите в разделе «Встроенные словари».
Если для региона не прописано население, возвращается 0.
В геобазе, население может быть прописано для дочерних регионов, но не прописано для родительских.
Проверяет принадлежность региона lhs региону rhs. Возвращает число типа UInt8, равное 1, если принадлежит и 0, если не принадлежит.
Отношение рефлексивное – любой регион принадлежит также самому себе.
Принимает число типа UInt32 – идентификатор региона из геобазы. Возвращает массив идентификаторов регионов, состоящий из переданного региона и всех родителей по цепочке.
Пример: regionHierarchy(toUInt32(213)) = [213,1,3,225,10001,10000].
Принимает число типа UInt32 – идентификатор региона из геобазы. Вторым аргументом может быть передана строка – название языка. Поддерживаются языки ru, en, ua, uk, by, kz, tr. Если второй аргумент отсутствует - используется язык ru. Если язык не поддерживается – кидается исключение. Возвращает строку - название региона на соответствующем языке. Если региона с указанным идентификатором не существует - возвращается пустая строка.
ua и uk обозначают одно и то же – украинский язык.
Смотрите раздел Операторы IN.
Это совсем необычная функция.
Обычные функции не изменяют множество строк, а лишь изменяют значения в каждой строке (map).
Агрегатные функции выполняют свёртку множества строк (fold, reduce).
Функция arrayJoin выполняет размножение каждой строки в множество строк (unfold).
Функция принимает в качестве аргумента массив, и размножает исходную строку в несколько строк – по числу элементов массива.
Все значения в столбцах просто копируются, кроме значения в столбце с применением этой функции – он заменяется на соответствующее значение массива.
В запросе может быть использовано несколько функций arrayJoin. В этом случае, соответствующее преобразование делается несколько раз.
Обратите внимание на синтаксис ARRAY JOIN в запросе SELECT, который предоставляет более широкие возможности.
Пример:
SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src
┌─dst─┬─\'Hello\'─┬─src──────┐
│ 1 │ Hello │ [1,2,3] │
│ 2 │ Hello │ [1,2,3] │
│ 3 │ Hello │ [1,2,3] │
└─────┴────────────┴──────────┘
Вычисляет расстояние между двумя точками на поверхности Земли по формуле большого круга.
Синтаксис:
greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
Входные параметры:
Положительные значения соответствуют северной широте и восточной долготе, отрицательные – южной широте и западной долготе.
Возвращаемое значение:
Генерирует исключение, когда значения входных параметров выходят за границы диапазонов.
Пример:
SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)
┌─greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)─┐
│ 14132374.194975413 │
└─────────────────────────────────────────────────────────────────────────┘
Вычисляет угловое расстояние на сфере по формуле большого круга.
Синтаксис:
greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
Входные параметры:
Возвращаемое значение:
Пример:
SELECT greatCircleAngle(0, 0, 45, 0) AS arc
┌─arc─┐
│ 45 │
└─────┘
Проверяет, принадлежит ли точка хотя бы одному из эллипсов.
Координаты – геометрические в декартовой системе координат.
Синтаксис:
pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ)
Входные параметры:
Входных параметров должно быть 2+4⋅n, где n – количество эллипсов.
Возвращаемые значения:
1, если точка внутри хотя бы одного из эллипсов, 0, если нет.
Пример:
SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
│ 1 │
└─────────────────────────────────────────────────────┘
Проверяет, принадлежит ли точка многоугольнику на плоскости.
Синтаксис:
pointInPolygon((x, y), [(a, b), (c, d) ...], ...)
Входные значения:
Возвращаемые значения:
Если точка находится на границе многоугольника, функция может возвращать как 0, так и 1.
Пример:
SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
┌─res─┐
│ 1 │
└─────┘
H3 – это система геокодирования, которая делит поверхность Земли на равные шестигранные ячейки. Система поддерживает иерархию (вложенность) ячеек, т.е. каждый "родительский" шестигранник может быть поделен на семь одинаковых вложенных "дочерних" шестигранников, и так далее.
Уровень вложенности называется разрешением и может принимать значение от 0 до 15, где 0 соответствует базовым ячейкам самого верхнего уровня (наиболее крупным).
Для каждой точки, имеющей широту и долготу, можно получить 64-битный индекс H3, соответствующий номеру шестигранной ячейки, где эта точка находится.
Индексы H3 используются, в основном, для геопозиционирования и расчета расстояний.
Проверяет корректность H3-индекса.
Синтаксис:
h3IsValid(h3index)
Параметр:
Возвращаемые значения:
Тип: UInt8.
Пример:
Запрос:
SELECT h3IsValid(630814730351855103) as h3IsValid
Результат:
┌─h3IsValid─┐
│ 1 │
└────────────┘
Извлекает разрешение H3-индекса.
Синтаксис:
h3GetResolution(h3index)
Параметр:
Возвращаемые значения:
Тип: UInt8.
Пример:
Запрос:
SELECT h3GetResolution(639821929606596015) as resolution
Результат:
┌─resolution─┐
│ 14 │
└─────────────┘
Рассчитывает средний размер стороны шестигранника H3 в градусах.
Синтаксис:
h3EdgeAngle(resolution)
Параметр:
Возвращаемое значение:
Пример:
Запрос:
SELECT h3EdgeAngle(10) as edgeAngle
Результат:
┌───────h3EdgeAngle(10)─┐
│ 0.0005927224846720883 │
└─────────────────────────┘
Рассчитывает средний размер стороны шестигранника H3 в метрах.
Синтаксис:
h3EdgeLengthM(resolution)
Параметр:
Возвращаемое значение:
Пример:
Запрос:
SELECT h3EdgeLengthM(15) as edgeLengthM
Результат:
┌─edgeLengthM─┐
│ 0.509713273 │
└──────────────┘
Возвращает H3 индекс точки (lon, lat) с заданным разрешением.
Синтаксис:
geoToH3(lon, lat, resolution)
Параметры:
Возвращаемые значения:
Тип данных: UInt64.
Пример:
Запрос:
SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index
Ответ:
┌─────────────h3Index─┐
│ 644325524701193974 │
└──────────────────────┘
Возвращает H3-индексы шестигранников в радиусе k от данного в произвольном порядке.
Синтаксис:
h3kRing(h3index, k)
Параметры:
Возвращаемые значения:
Тип данных: Array(UInt64).
Пример:
Запрос:
SELECT arrayJoin(h3kRing(644325529233966508, 1)) AS h3index
Результат:
┌─────────────h3index─┐
│ 644325529233966508 │
│ 644325529233966497 │
│ 644325529233966510 │
│ 644325529233966504 │
│ 644325529233966509 │
│ 644325529233966355 │
│ 644325529233966354 │
└──────────────────────┘
Определяет номер базовой (верхнеуровневой) шестиугольной H3-ячейки для указанной ячейки.
Синтаксис:
h3GetBaseCell(index)
Параметр:
Возвращаемое значение:
Тип: UInt8.
Пример:
Запрос:
SELECT h3GetBaseCell(612916788725809151) as basecell;
Результат:
┌─basecell─┐
│ 12 │
└───────────┘
Определяет среднюю площадь шестиугольной H3-ячейки заданного разрешения в квадратных метрах.
Синтаксис:
h3HexAreaM2(resolution)
Параметр:
Возвращаемое значение:
Пример:
Запрос:
SELECT h3HexAreaM2(13) as area;
Результат:
┌─area─┐
│ 43.9 │
└──────┘
Определяет, являются ли H3-ячейки соседями.
Синтаксис:
h3IndexesAreNeighbors(index1, index2)
Параметры:
Возвращаемое значение:
Тип: UInt8.
Пример:
Запрос:
SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n;
Результат:
┌─n─┐
│ 1 │
└───┘
Формирует массив дочерних (вложенных) H3-ячеек для указанной ячейки.
Синтаксис:
h3ToChildren(index, resolution)
Параметры:
Возвращаемое значение:
Тип: Array(UInt64).
Пример:
Запрос:
SELECT h3ToChildren(599405990164561919, 6) AS children;
Результат:
┌─children──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Определяет родительскую (более крупную) H3-ячейку, содержащую указанную ячейку.
Синтаксис:
h3ToParent(index, resolution)
Параметры:
Возвращаемое значение:
Тип: UInt64.
Пример:
Запрос:
SELECT h3ToParent(599405990164561919, 3) as parent;
Результат:
┌──────────────parent─┐
│ 590398848891879423 │
└──────────────────────┘
Преобразует H3-индекс из числового представления H3Index в строковое.
Синтаксис:
h3ToString(index)
Параметр:
Возвращаемое значение:
Тип: String.
Пример:
Запрос:
SELECT h3ToString(617420388352917503) as h3_string;
Результат:
┌─h3_string────────┐
│ 89184926cdbffff │
└───────────────────┘
Преобразует H3-индекс из строкового представления в числовое представление H3Index.
Синтаксис:
stringToH3(index_str)
Параметр:
Возвращаемое значение:
Тип: UInt64.
Пример:
Запрос:
SELECT stringToH3('89184926cc3ffff') as index;
Результат:
┌───────────────index─┐
│ 617420388351344639 │
└──────────────────────┘
Определяет разрешение H3-ячейки.
Синтаксис:
h3GetResolution(index)
Параметр:
Возвращаемое значение:
Тип: UInt8.
Пример:
Запрос:
SELECT h3GetResolution(617420388352917503) as res;
Результат:
┌─res─┐
│ 9 │
└─────┘
Geohash – это система геокодирования, которая делит поверхность Земли на участки в виде "решетки", и каждую ячейку решетки кодирует в виде строки из букв и цифр. Система поддерживает иерархию (вложенность) ячеек, поэтому чем точнее определена геопозиция, тем длиннее строка с кодом соответствующей ячейки.
Для ручного преобразования географических координат в строку geohash можно использовать сайт geohash.org.
Кодирует широту и долготу в строку geohash.
Синтаксис:
geohashEncode(longitude, latitude, [precision])
Входные значения:
Возвращаемые значения:
Пример:
SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res
┌─res───────────┐
│ ezs42d000000 │
└───────────────┘
Декодирует любую строку, закодированную в geohash, на долготу и широту.
Синтаксис:
geohashDecode(geohash_string)
Входные значения:
Возвращаемые значения:
Пример:
SELECT geohashDecode('ezs42') AS res
┌─res────────────────────────────────┐
│ (-5.60302734375,42.60498046875) │
└────────────────────────────────────┘
Формирует массив участков, которые находятся внутри или пересекают границу заданного участка на поверхности. Каждый участок описывается строкой geohash заданной точности.
Синтаксис:
geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)
Параметры
Замечание: Все передаваемые координаты должны быть одного и того же типа: либо Float32, либо Float64.
Возвращаемые значения:
Тип данных: Array(String).
Замечание:
Если возвращаемый массив содержит свыше 10 000 000 элементов, функция сгенерирует исключение.
Пример:
Запрос:
SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos
Результат:
┌─thasos─────────────────────────────────────────┐
│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │
└─────────────────────────────────────────────────┘
Проверяет является ли аргумент NULL.
Синтаксис:
isNull(x)
Синоним: ISNULL.
Параметры:
Возвращаемое значение:
Пример:
Входная таблица:
┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴───────┘
Запрос:
SELECT x FROM t_null WHERE isNull(y)
┌─x─┐
│ 1 │
└───┘
Проверяет не является ли аргумент NULL.
Синтаксис:
isNotNull(x)
Параметры:
Возвращаемое значение:
Пример:
Входная таблица:
┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴───────┘
Запрос:
SELECT x FROM t_null WHERE isNotNull(y)
┌─x─┐
│ 2 │
└───┘
Последовательно слева-направо проверяет являются ли переданные аргументы NULL и возвращает первый не NULL.
Синтаксис:
coalesce(x,...)
Параметры
Возвращаемые значения:
Пример:
Рассмотрим адресную книгу, в которой может быть указано несколько способов связи с клиентом.
┌─name─────┬─mail─┬─phone──────┬──icq─┐
│ client 1 │ ᴺᵁᴸᴸ │ 123-45-67 │ 123 │
│ client 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└───────────┴──────┴────────────┴───────┘
Поля mail и phone имеют тип String, а поле icq – UInt32, его необходимо будет преобразовать в String.
Получим из адресной книги первый доступный способ связаться с клиентом:
SELECT coalesce(mail, phone, CAST(icq,'Nullable(String)')) FROM aBook
┌─name─────┬─coalesce(mail, phone, CAST(icq, 'Nullable(String)'))─┐
│ client 1 │ 123-45-67 │
│ client 2 │ ᴺᵁᴸᴸ │
└───────────┴──────────────────────────────────────────────────────────┘
Возвращает альтернативное значение, если основной аргумент – NULL.
Синтаксис:
Параметры:
Возвращаемые значения:
Пример:
SELECT ifNull('a', 'b')
┌─ifNull('a', 'b')─┐
│ a │
└────────────────────┘
SELECT ifNull(NULL, 'b')
┌─ifNull(NULL, 'b')─┐
│ b │
└─────────────────────┘
Возвращает NULL, если аргументы равны.
Синтаксис:
nullIf(x, y)
Параметры:
x, y – значения для сравнивания. Они должны быть совместимых типов, иначе RT.WideStore сгенерирует исключение.
Возвращаемые значения:
Пример:
SELECT nullIf(1, 1)
┌─nullIf(1, 1)─┐
│ ᴺᵁᴸᴸ │
└───────────────┘
SELECT nullIf(1, 2)
┌─nullIf(1, 2)─┐
│ 1 │
└───────────────┘
Приводит значение типа Nullable к не Nullable, если значение не NULL.
Синтаксис:
assumeNotNull(x)
Параметры:
Возвращаемые значения:
Пример:
Рассмотрим таблицу t_null.
SHOW CREATE TABLE t_null
┌─statement───────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE default.t_null ( x Int8, y Nullable(Int8)) ENGINE = TinyLog │
└──────────────────────────────────────────────────────────────────────────────────┘
┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴───────┘
Применим функцию assumeNotNull к столбцу y.
SELECT assumeNotNull(y) FROM t_null
┌─assumeNotNull(y)─┐
│ 0 │
│ 3 │
└────────────────────┘
SELECT toTypeName(assumeNotNull(y)) FROM t_null
┌─toTypeName(assumeNotNull(y))─┐
│ Int8 │
│ Int8 │
└─────────────────────────────────┘
Преобразует тип аргумента к Nullable.
Синтаксис:
toNullable(x)
Параметры:
Возвращаемое значение значение:
Пример:
SELECT toTypeName(10)
┌─toTypeName(10)─┐
│ UInt8 │
└─────────────────┘
SELECT toTypeName(toNullable(10))
┌─toTypeName(toNullable(10))─┐
│ Nullable(UInt8) │
└──────────────────────────────┘