ALL(cond FOR var IN json.array) применяется к JSON-массивам и возвращает 1, если условие истинно для всех элементов массива, и 0 в противном случае. cond — это общее выражение, которое также может использовать var как текущее значение элемента массива внутри себя.
- ALL() with json
- ALL() with json ex. 2
select *, ALL(x>0 AND x<4 FOR x IN j.ar) from tblselect *, ALL(x>0 AND x<4 FOR x IN j.ar) cond from tbl where cond=1+------+--------------+--------------------------------+
| id | j | all(x>0 and x<4 for x in j.ar) |
+------+--------------+--------------------------------+
| 1 | {"ar":[1,3]} | 1 |
| 2 | {"ar":[3,7]} | 0 |
+------+--------------+--------------------------------+
2 rows in set (0.00 sec)+------+--------------+------+
| id | j | cond |
+------+--------------+------+
| 1 | {"ar":[1,3]} | 1 |
+------+--------------+------+
1 row in set (0.00 sec)ALL(mva) — это специальный конструктор для мультизначных атрибутов. При использовании с операторами сравнения (включая сравнение с IN()), он возвращает 1, если все значения из MVA-атрибута найдены среди сравниваемых значений.
- ALL() with MVA
- ALL() with MVA and IN()
select * from tbl where all(m) >= 1select * from tbl where all(m) in (1, 3, 7, 10)+------+------+
| id | m |
+------+------+
| 1 | 1,3 |
| 2 | 3,7 |
+------+------+
2 rows in set (0.00 sec)+------+------+
| id | m |
+------+------+
| 1 | 1,3 |
| 2 | 3,7 |
+------+------+
2 rows in set (0.00 sec)Для сравнения MVA-атрибута с массивом избегайте использования <mva> NOT ALL(); вместо этого используйте ALL(<mva>) NOT IN().
- ALL() with MVA and NOT IN()
select * from tbl where all(m) not in (2, 4)+------+------+
| id | m |
+------+------+
| 1 | 1,3 |
| 2 | 3,7 |
+------+------+
2 rows in set (0.00 sec)ALL(string list) — это специальная операция для фильтрации строковых тегов.
Если все слова, перечисленные в аргументах ALL(), присутствуют в атрибуте, фильтр срабатывает. Опциональный NOT инвертирует логику.
Этот фильтр внутренне использует пословное сопоставление, поэтому в случае полного сканирования запрос может работать медленнее, чем ожидалось. Он предназначен для атрибутов, которые не индексируются, например, вычисляемых выражений или тегов в PQ-таблицах. Если вам нужна такая фильтрация, рассмотрите вариант размещения строкового атрибута как полнотекстового поля, а затем используйте полнотекстовый оператор match(), который вызовет полнотекстовый поиск.
- ALL() with strings
- ALL() with strings and NOT
select * from tbl where tags all('bug', 'release')mysql> select * from tbl
+------+---------------------------+
| id | tags |
+------+---------------------------+
| 1 | bug priority_high release |
| 2 | bug priority_low release |
+------+---------------------------+
2 rows in set (0.00 sec)
mysql> select * from tbl where tags not all('bug')
Empty set (0.00 sec)+------+---------------------------+
| id | tags |
+------+---------------------------+
| 1 | bug priority_high release |
| 2 | bug priority_low release |
+------+---------------------------+
2 rows in set (0.00 sec)ANY(cond FOR var IN json.array) применяется к JSON-массивам и возвращает 1, если условие истинно для любого элемента массива, и 0 в противном случае. cond — это общее выражение, которое также может использовать var как текущее значение элемента массива внутри себя.
- ANY() with json
- ANY() with json ex. 2
select *, ANY(x>5 AND x<10 FOR x IN j.ar) from tblselect *, ANY(x>5 AND x<10 FOR x IN j.ar) cond from tbl where cond=1+------+--------------+---------------------------------+
| id | j | any(x>5 and x<10 for x in j.ar) |
+------+--------------+---------------------------------+
| 1 | {"ar":[1,3]} | 0 |
| 2 | {"ar":[3,7]} | 1 |
+------+--------------+---------------------------------+
2 rows in set (0.00 sec)+------+--------------+------+
| id | j | cond |
+------+--------------+------+
| 2 | {"ar":[3,7]} | 1 |
+------+--------------+------+
1 row in set (0.00 sec)ANY(mva) — это специальный конструктор для мультизначных атрибутов. При использовании с операторами сравнения (включая сравнение с IN()), он возвращает 1, если любое из значений MVA найдено среди сравниваемых значений.
При сравнении массива с помощью IN() по умолчанию предполагается ANY(), если не указано иное, но будет выдано предупреждение о пропущенном конструкторе.
- ANY() with MVA
- ANY() with MVA and IN()
mysql> select * from tbl
+------+------+
| id | m |
+------+------+
| 1 | 1,3 |
| 2 | 3,7 |
+------+------+
2 rows in set (0.01 sec)
mysql> select * from tbl where any(m) > 5
+------+------+
| id | m |
+------+------+
| 2 | 3,7 |
+------+------+
1 row in set (0.00 sec)select * from tbl where any(m) in (1, 7, 10)+------+------+
| id | m |
+------+------+
| 1 | 1,3 |
| 2 | 3,7 |
+------+------+
2 rows in set (0.00 sec)Для сравнения MVA-атрибута с массивом избегайте использования <mva> NOT ANY(); вместо этого используйте <mva> NOT IN() или ANY(<mva>) NOT IN().
- ANY() with MVA and NOT IN()
mysql> select * from tbl
+------+------+
| id | m |
+------+------+
| 1 | 1,3 |
| 2 | 3,7 |
+------+------+
2 rows in set (0.00 sec)
mysql> select * from tbl where any(m) not in (1, 3, 5)
+------+------+
| id | m |
+------+------+
| 2 | 3,7 |
+------+------+
1 row in set (0.00 sec)ANY(string list) — это специальная операция для фильтрации строковых тегов.
Если любое из слов, перечисленных в аргументах ANY(), присутствует в атрибуте, фильтр срабатывает. Опциональный NOT инвертирует логику.
Этот фильтр внутренне использует пословное сопоставление, поэтому в случае полного сканирования запрос может работать медленнее, чем ожидалось. Он предназначен для атрибутов, которые не индексируются, например, вычисляемых выражений или тегов в PQ-таблицах. Если вам нужна такая фильтрация, рассмотрите вариант размещения строкового атрибута как полнотекстового поля, а затем используйте полнотекстовый оператор match(), который вызовет полнотекстовый поиск.
- ANY() with strings
- ANY() with strings and NOT
select * from tbl where tags any('bug', 'feature')select * from tbl
--------------
+------+---------------------------+
| id | tags |
+------+---------------------------+
| 1 | bug priority_high release |
| 2 | bug priority_low release |
+------+---------------------------+
2 rows in set (0.00 sec)
--------------
select * from tbl where tags not any('feature', 'priority_low')
--------------
+------+---------------------------+
| id | tags |
+------+---------------------------+
| 1 | bug priority_high release |
+------+---------------------------+
1 row in set (0.01 sec)+------+---------------------------+
| id | tags |
+------+---------------------------+
| 1 | bug priority_high release |
| 2 | bug priority_low release |
+------+---------------------------+
2 rows in set (0.00 sec)CONTAINS(polygon, x, y) проверяет, находится ли точка (x,y) внутри заданного полигона, и возвращает 1, если да, или 0, если нет. Полигон должен быть задан с помощью функции POLY2D(). Эта функция предназначена для "маленьких" полигонов, то есть со стороной менее 500 км (300 миль), и не учитывает кривизну Земли для ускорения. Для больших расстояний следует использовать GEOPOLY2D, который разбивает заданный полигон на меньшие части с учётом кривизны Земли.
Поведение IF() немного отличается от аналога в MySQL. Он принимает 3 аргумента, проверяет, равен ли первый аргумент 0.0, возвращает второй аргумент, если он не равен нулю, или третий, если равен. Обратите внимание, что в отличие от операторов сравнения, IF() не использует порог! Поэтому безопасно использовать результаты сравнений в качестве первого аргумента, но арифметические операторы могут давать неожиданные результаты. Например, следующие два вызова дадут разные результаты, хотя логически эквивалентны:
- IF()
IF ( sqrt(3)*sqrt(3)-3<>0, a, b )
IF ( sqrt(3)*sqrt(3)-3, a, b )В первом случае оператор сравнения <> вернёт 0.0 (ложь) из-за порога, и IF() всегда вернёт ** как результат. Во втором случае выражение sqrt(3)*sqrt(3)-3 будет сравниваться с нулём без порога самой функцией IF(). Однако его значение будет немного отличаться от нуля из-за ограниченной точности вычислений с плавающей точкой. Из-за этого сравнение с 0.0, выполненное IF(), не пройдёт, и второй вариант вернёт 'a' как результат.
HISTOGRAM(expr, {hist_interval=size, hist_offset=value}) принимает размер корзины и возвращает номер корзины для значения. Ключевая функция:
key_of_the_bucket = interval + offset * floor ( ( value - offset ) / interval )
Аргумент гистограммы interval должен быть положительным. Аргумент гистограммы offset должен быть положительным и меньше interval. Он используется в агрегации, FACET и группировке.
- HISTOGRAM()
SELECT COUNT(*),
HISTOGRAM(price, {hist_interval=100}) as price_range
FROM facets
GROUP BY price_range ORDER BY price_range ASC;IN(expr,val1,val2,...) принимает 2 или более аргументов и возвращает 1, если первый аргумент (expr) равен любому из других аргументов (val1..valN), или 0 в противном случае. В настоящее время все проверяемые значения (но не само выражение) должны быть константами. Константы предварительно сортируются, и используется бинарный поиск, поэтому IN() даже при большом произвольном списке констант будет очень быстрым. Первый аргумент также может быть атрибутом MVA. В этом случае IN() вернет 1, если любое из значений MVA равно любому из других аргументов. IN() также поддерживает синтаксис IN(expr,@uservar) для проверки, принадлежит ли значение списку в данном глобальном пользовательском переменном. Первый аргумент может быть JSON-атрибутом.
Функция INDEXOF(cond FOR var IN json.array) перебирает все элементы массива и возвращает индекс первого элемента, для которого 'cond' истинно, и -1, если 'cond' ложно для каждого элемента массива.
INTERVAL(expr,point1,point2,point3,...) принимает 2 или более аргументов и возвращает индекс аргумента, который меньше первого аргумента: возвращает 0, если expr<point1, 1, если point1<=expr<point2 и так далее. Для корректной работы функции требуется, чтобы point1<point2<...<pointN.
Функция LENGTH(attr_mva) возвращает количество элементов в наборе MVA. Она работает как с 32-битными, так и с 64-битными атрибутами MVA. LENGTH(attr_json) возвращает длину поля в JSON. Возвращаемое значение зависит от типа поля. Например, LENGTH(json_attr.some_int) всегда возвращает 1, а LENGTH(json_attr.some_array) возвращает количество элементов в массиве. Функция LENGTH(string_expr) возвращает длину строки, полученной из выражения.
TO_STRING() должна обрамлять выражение, независимо от того, возвращает ли выражение нестроковое значение или это просто строковый атрибут.
RANGE(expr, {range_from=value,range_to=value}) принимает набор диапазонов и возвращает номер корзины для значения.
Это выражение включает значение range_from и исключает значение range_to для каждого диапазона. Диапазон может быть открытым — иметь только значение range_from или только range_to. Используется в агрегации, FACET и группировке.
- RANGE()
SELECT COUNT(*),
RANGE(price, {range_to=150},{range_from=150,range_to=300},{range_from=300}) price_range
FROM facets
GROUP BY price_range ORDER BY price_range ASC;Функция REMAP(condition, expression, (cond1, cond2, ...), (expr1, expr2, ...)) позволяет делать некоторые исключения для значений выражения в зависимости от значений условия. Выражение условия всегда должно возвращать целое число, в то время как выражение может возвращать целое число или число с плавающей точкой.
- REMAP()
- Another example
SELECT id, size, REMAP(size, 15, (5,6,7,8), (1,1,2,2)) s
FROM products
ORDER BY s ASC;SELECT REMAP(userid, karmapoints, (1, 67), (999, 0)) FROM users;
SELECT REMAP(id%10, salary, (0), (0.0)) FROM employes;Это поместит документы с размерами 5 и 6 первыми, за ними последуют размеры 7 и 8. В случае, если есть исходное значение, не указанное в массиве (например, размер 10), оно по умолчанию будет равно 15 и в этом случае будет размещено в конце.
Обратите внимание, что CURTIME(), UTC_TIME(), UTC_TIMESTAMP(), и TIMEDIFF() могут быть преобразованы в числовые типы с помощью произвольных функций преобразования, таких как BIGINT(), DOUBLE() и т.д.
Возвращает текущую метку времени в виде INTEGER.
- SQL
select NOW();+------------+
| NOW() |
+------------+
| 1615788407 |
+------------+Возвращает текущее время в локальном часовом поясе в формате hh:ii:ss.
- SQL
select CURTIME();+-----------+
| CURTIME() |
+-----------+
| 07:06:30 |
+-----------+Возвращает текущую дату в локальном часовом поясе в формате YYYY-MM-DD.
- SQL
select curdate();+------------+
| curdate() |
+------------+
| 2023-08-02 |
+------------+Возвращает текущее время в часовом поясе UTC в формате hh:ii:ss.
- SQL
select UTC_TIME();+------------+
| UTC_TIME() |
+------------+
| 06:06:18 |
+------------+Возвращает текущее время в часовом поясе UTC в формате YYYY-MM-DD hh:ii:ss.
- SQL
select UTC_TIMESTAMP();+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2021-03-15 06:06:03 |
+---------------------+Возвращает целочисленное значение секунд (в диапазоне 0..59) из аргумента метки времени, согласно текущему часовому поясу.
- SQL
select second(now());+---------------+
| second(now()) |
+---------------+
| 52 |
+---------------+Возвращает целочисленное значение минут (в диапазоне 0..59) из аргумента метки времени, согласно текущему часовому поясу.
- SQL
select minute(now());+---------------+
| minute(now()) |
+---------------+
| 5 |
+---------------+Возвращает целочисленное значение часов (в диапазоне 0..23) из аргумента метки времени, согласно текущему часовому поясу.
- SQL
select hour(now());+-------------+
| hour(now()) |
+-------------+
| 7 |
+-------------+Возвращает целочисленное значение дня месяца (в диапазоне 1..31) из аргумента метки времени, согласно текущему часовому поясу.
- SQL
select day(now());+------------+
| day(now()) |
+------------+
| 15 |
+------------+Возвращает целочисленное значение месяца (в диапазоне 1..12) из аргумента метки времени, согласно текущему часовому поясу.
- SQL
select month(now());+--------------+
| month(now()) |
+--------------+
| 3 |
+--------------+Возвращает целочисленное значение квартала года (в диапазоне 1..4) из аргумента метки времени, согласно текущему часовому поясу.
- SQL
select quarter(now());+----------------+
| quarter(now()) |
+----------------+
| 2 |
+----------------+Возвращает целочисленное значение года (в диапазоне 1969..2038) из аргумента метки времени, согласно текущему часовому поясу.
- SQL
select year(now());+-------------+
| year(now()) |
+-------------+
| 2024 |
+-------------+Возвращает название дня недели для заданного аргумента метки времени, согласно текущему часовому поясу.
- SQL
select dayname(now());+----------------+
| dayname(now()) |
+----------------+
| Wednesday |
+----------------+Возвращает название месяца для заданного аргумента метки времени, согласно текущему часовому поясу.
- SQL
select monthname(now());+------------------+
| monthname(now()) |
+------------------+
| August |
+------------------+Возвращает целочисленный индекс дня недели (в диапазоне 1..7) для заданного аргумента метки времени, согласно текущему часовому поясу. Обратите внимание, что неделя начинается с воскресенья.
- SQL
select dayofweek(now());+------------------+
| dayofweek(now()) |
+------------------+
| 5 |
+------------------+Возвращает целочисленное значение дня года (в диапазоне 1..366) для заданного аргумента метки времени, согласно текущему часовому поясу.
- SQL
select dayofyear(now());+------------------+
| dayofyear(now()) |
+------------------+
| 214 |
+------------------+Возвращает целочисленное значение года и код дня первого дня текущей недели (в диапазоне 1969001..2038366) для заданного аргумента метки времени, согласно текущему часовому поясу.
- SQL
select yearweek(now());+-----------------+
| yearweek(now()) |
+-----------------+
| 2023211 |
+-----------------+Возвращает целочисленное значение года и месяца (в диапазоне 196912..203801) из аргумента метки времени, согласно текущему часовому поясу.
- SQL
select yearmonth(now());+------------------+
| yearmonth(now()) |
+------------------+
| 202103 |
+------------------+Возвращает целочисленное значение года, месяца и дня (в диапазоне от 19691231 до 20380119) на основе текущего часового пояса.
- SQL
select yearmonthday(now());+---------------------+
| yearmonthday(now()) |
+---------------------+
| 20210315 |
+---------------------+Вычисляет разницу между двумя метками времени в формате hh:ii:ss.
- SQL
select timediff(1615787586, 1613787583);+----------------------------------+
| timediff(1615787586, 1613787583) |
+----------------------------------+
| 555:33:23 |
+----------------------------------+Вычисляет количество дней между двумя заданными метками времени.
- SQL
select datediff(1615787586, 1613787583);+----------------------------------+
| datediff(1615787586, 1613787583) |
+----------------------------------+
| 23 |
+----------------------------------+Форматирует часть даты из аргумента метки времени в строку в формате YYYY-MM-DD.
- SQL
select date(now());+-------------+
| date(now()) |
+-------------+
| 2023-08-02 |
+-------------+Форматирует часть времени из аргумента метки времени в строку в формате HH:MM:SS.
- SQL
select time(now());+-------------+
| time(now()) |
+-------------+
| 15:21:27 |
+-------------+Возвращает отформатированную строку на основе предоставленных аргументов даты и формата. Аргумент формата использует те же спецификаторы, что и функция strftime. Для удобства, вот некоторые распространённые спецификаторы формата:
%Y- Год из четырёх цифр%m- Двухзначный месяц (01-12)%d- Двухзначный день месяца (01-31)%H- Двухзначный час (00-23)%M- Двухзначная минута (00-59)%S- Двухзначная секунда (00-59)%T- Время в 24-часовом формате (%H:%M:%S)
Обратите внимание, что это не полный список спецификаторов. Пожалуйста, обратитесь к документации по strftime() для вашей операционной системы, чтобы получить полный список.
- SQL
SELECT DATE_FORMAT(NOW(), 'year %Y and time %T');+------------------------------------------+
| DATE_FORMAT(NOW(), 'year %Y and time %T') |
+------------------------------------------+
| year 2023 and time 11:54:52 |
+------------------------------------------+Этот пример форматирует текущие дату и время, отображая четырехзначный год и время в 24-часовом формате.
DATE_HISTOGRAM(expr, {calendar_interval='unit_name'}) принимает размер корзины в виде названия единицы и возвращает номер корзины для значения. Значения округляются до ближайшей корзины. Ключевая функция:
key_of_the_bucket = interval * floor ( value / interval )
Интервалы могут быть указаны с помощью названия единицы, например week, или как одна единица, например 1M. Однако множественные единицы, такие как 2d, не поддерживаются с calendar_interval, но разрешены с fixed_interval.
Допустимые интервалы для calendar_interval:
minute,1mhour,1hday,1dweek,1w(неделя — это интервал между начальным днем недели, часом, минутой, секундой и следующей неделей, но в тот же день и время недели)month,1Myear,1y(год — это интервал между начальным днем месяца, временем и следующим годом, но в тот же день месяца и время)
Допустимые интервалы для fixed_interval:
minute,2mhour,3hday,5d
Используется в агрегациях, FACET и группировках.
Пример:
SELECT COUNT(*),
DATE_HISTOGRAM(tm, {calendar_interval='month'}) AS months
FROM facets
GROUP BY months ORDER BY months ASC;
DATE_RANGE(expr, {range_from='date_math', range_to='date_math'}) принимает набор диапазонов и возвращает номер корзины для значения.
Выражение включает значение range_from и исключает значение range_to для каждого диапазона. Диапазон может быть открытым — иметь только значение range_from или только range_to.
Отличие от функции RANGE() в том, что значения range_from и range_to могут быть выражены в выражениях Date math.
Используется в агрегациях, FACET и группировках.
Пример:
SELECT COUNT(*),
DATE_RANGE(tm, {range_to='2017||+2M/M'},{range_from='2017||+2M/M',range_to='2017||+5M/M'},{range_from='2017||+5M/M'}) AS points
FROM idx_dates
GROUP BY points ORDER BY points ASC;
Date math позволяет работать с датами и временем непосредственно в ваших поисках. Это особенно полезно для обработки данных, которые меняются со временем. С помощью date math вы можете легко находить записи за определенный период, анализировать тенденции данных или управлять временем удаления информации. Это упрощает работу с датами, позволяя добавлять или вычитать время от заданной даты, округлять даты до ближайшей единицы времени и многое другое, всё это в рамках ваших поисковых запросов.
Для использования date math вы начинаете с базовой даты, которая может быть:
nowдля текущей даты и времени,- или конкретной строкой даты, заканчивающейся на
||.
Затем вы можете модифицировать эту дату операциями, такими как:
+1yчтобы добавить один год,-1hчтобы вычесть один час,/mчтобы округлить до ближайшего месяца.
Вы можете использовать следующие единицы в операциях:
sдля секунд,mдля минут,h(илиH) для часов,dдля дней,wдля недель,Mдля месяцев,yдля лет.
Вот несколько примеров использования date math:
now+4hозначает четыре часа от текущего момента.now-2d/d— время два дня назад, округленное до ближайшего дня.2010-04-20||+2M/d— 20 июня 2010 года, округленное до ближайшего дня.
Функция GEODIST(lat1, lon1, lat2, lon2, [...]) вычисляет геосферное расстояние между двумя точками, заданными их координатами. Обратите внимание, что по умолчанию и широты, и долготы должны быть в радианах, а результат будет в метрах. Для любых из четырёх координат можно использовать произвольные выражения. Оптимальный путь будет выбран, если одна пара аргументов напрямую ссылается на пару атрибутов, а другая — является константой.
GEODIST() также принимает необязательный 5-й аргумент, позволяющий легко конвертировать между входными и выходными единицами и выбирать конкретную формулу георасстояния. Полный синтаксис и несколько примеров приведены ниже:
GEODIST(lat1, lon1, lat2, lon2, { option=value, ... })
GEODIST(40.7643929, -73.9997683, 40.7642578, -73.9994565, {in=degrees, out=feet})
GEODIST(51.50, -0.12, 29.98, 31.13, {in=deg, out=mi})
Известные опции и их значения:
in = {deg | degrees | rad | radians}, задаёт входные единицы;out = {m | meters | km | kilometers | ft | feet | mi | miles | yd | yards | in | inch | cm | centimeters | mm | millimeters | NM | nmi | nauticalmiles}, задаёт выходные единицы;method = {adaptive | haversine}, задаёт метод вычисления георасстояния.
Метод по умолчанию — "adaptive". Это хорошо оптимизированная реализация, которая во всех случаях точнее и значительно быстрее, чем "haversine".
GEOPOLY2D(lat1,lon1,lat2,lon2,lat3,lon3...) создаёт полигон для использования с функцией CONTAINS(). Эта функция учитывает кривизну Земли, разбивая полигон на более мелкие, и должна использоваться для больших территорий. Для небольших областей можно использовать функцию POLY2D(). Функция ожидает пары координат широты/долготы в градусах; если используются радианы, результат будет таким же, как у POLY2D().
POLY2D(x1,y1,x2,y2,x3,y3...) создаёт полигон для использования с функцией CONTAINS(). Этот полигон предполагает плоскую Землю, поэтому он не должен быть слишком большим; для больших территорий следует использовать функцию GEOPOLY2D(), которая учитывает кривизну Земли.
Объединяет две или более строк в одну. Аргументы, не являющиеся строками, должны быть явно преобразованы в строку с помощью функции TO_STRING().
CONCAT(TO_STRING(float_attr), ',', TO_STRING(int_attr), ',', title)
LEVENSHTEIN ( pattern, source, {normalize=0, length_delta=0}) возвращает число (расстояние Левенштейна) односимвольных изменений (вставок, удалений или замен) между строками pattern и source, необходимых для преобразования pattern в source.
pattern,source- константная строка, имя строкового поля, имя JSON-поля или любое выражение, которое возвращает строку (например, SUBSTRING_INDEX())normalize- опция для возврата расстояния в виде числа с плавающей точкой в диапазоне[0.0 - 1.0], где 0.0 — точное совпадение, а 1.0 — максимальное различие. Значение по умолчанию 0, что означает отсутствие нормализации и возврат результата в виде целого числа.length_delta- пропускает вычисление расстояния Левенштейна и возвращаетmax(strlen(pattern), strlen(source)), если опция установлена и длины строк отличаются более чем на значениеlength_delta. Значение по умолчанию 0, что означает вычисление расстояния Левенштейна для любых входных строк. Эта опция может быть полезна при проверке преимущественно похожих строк.
SELECT LEVENSHTEIN('gily', attr1) AS dist, WEIGHT() AS w FROM test WHERE MATCH('test') ORDER BY w DESC, dist ASC;
SELECT LEVENSHTEIN('gily', j.name, {length_delta=6}) AS dist, WEIGHT() AS w FROM test WHERE MATCH('test') ORDER BY w DESC;
SELECT LEVENSHTEIN(title, j.name, {normalize=1}) AS dist, WEIGHT() AS w FROM test WHERE MATCH ('test') ORDER BY w DESC, dist ASC;
Функция REGEX(attr,expr) возвращает 1, если регулярное выражение совпадает со строкой атрибута, и 0 в противном случае. Работает как со строковыми, так и с JSON-атрибутами.
SELECT REGEX(content, 'box?') FROM test;
SELECT REGEX(j.color, 'red | pink') FROM test;
Выражения должны соответствовать синтаксису RE2. Для выполнения поиска без учета регистра, например, можно использовать:
SELECT REGEX(content, '(?i)box') FROM test;
Функция SNIPPET() может использоваться для выделения результатов поиска в заданном тексте. Первые два аргумента: текст для выделения и запрос. Опции могут передаваться функции в качестве третьего, четвертого и последующих аргументов. SNIPPET() может получать текст для выделения непосредственно из таблицы. В этом случае первым аргументом должно быть имя поля:
SELECT SNIPPET(body, QUERY()) FROM myIndex WHERE MATCH('my.query')
В этом примере выражение QUERY() возвращает текущий полнотекстовый запрос. SNIPPET() также может выделять неиндексированный текст:
mysql SELECT id, SNIPPET('text to highlight', 'my.query', 'limit=100') FROM myIndex WHERE MATCH('my.query')
Кроме того, она может использоваться для выделения текста, полученного из других источников с помощью функции, определенной пользователем (UDF):
SELECT id, SNIPPET(myUdf(id), 'my.query', 'limit=100') FROM myIndex WHERE MATCH('my.query')
В данном контексте myUdf() — это функция, определенная пользователем (UDF), которая извлекает документ по его ID из внешнего источника хранения. Функция SNIPPET() считается функцией "post limit", что означает, что вычисление сниппетов откладывается до подготовки всего итогового набора результатов, даже после применения оператора LIMIT. Например, если используется оператор LIMIT 20,10, SNIPPET() будет вызвана не более 10 раз.
Важно отметить, что SNIPPET() не поддерживает ограничения по полям. Для этой функциональности используйте HIGHLIGHT().
SUBSTRING_INDEX(string, delimiter, number) возвращает подстроку исходной строки, основанную на указанном количестве вхождений разделителя:
- string - исходная строка, которая может быть константной строкой или строкой из строкового/JSON-атрибута.
- delimiter - разделитель для поиска.
- number - количество раз для поиска разделителя. Может быть положительным или отрицательным числом. Если число положительное, функция вернет все слева от разделителя. Если отрицательное — все справа от разделителя.
По умолчанию SUBSTRING_INDEX() возвращает строку, но при необходимости может быть приведена к другим типам (например, целому или числу с плавающей точкой). Числовые значения можно преобразовать с помощью специальных функций (например, BIGINT(), DOUBLE() и т.д.).
- SQL
SELECT SUBSTRING_INDEX('www.w3schools.com', '.', 2) FROM test;
SELECT SUBSTRING_INDEX(j.coord, ' ', 1) FROM test;
SELECT SUBSTRING_INDEX('1.2 3.4', ' ', 1); /* '1.2' */
SELECT SUBSTRING_INDEX('1.2 3.4', ' ', -1); /* '3.4' */
SELECT sint ( SUBSTRING_INDEX('1.2 3.4', ' ', 1)); /* 1 */
SELECT sint ( SUBSTRING_INDEX('1.2 3.4', ' ', -1)); /* 3 */
SELECT double ( SUBSTRING_INDEX('1.2 3.4', ' ', 1)); /* 1.200000 */
SELECT double ( SUBSTRING_INDEX('1.2 3.4', ' ', -1)); /* 3.400000 */UPPER(string) преобразует аргумент в верхний регистр, LOWER(string) преобразует аргумент в нижний регистр.
Результат также может быть преобразован в числовой тип, но только если строковый аргумент можно преобразовать в число. Числовые значения могут быть преобразованы с помощью произвольных функций (BITINT, DOUBLE и т.д.).
SELECT upper('www.w3schools.com', '.', 2); /* WWW.W3SCHOOLS.COM */
SELECT double (upper ('1.2e3')); /* 1200.000000 */
SELECT integer (lower ('12345')); /* 12345 */