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() 的比较)一起使用时,如果 MVA 属性中的所有值都在被比较的值中,则返回 1。
- 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() 的比较)一起使用时,如果 MVA 属性中的任一值在被比较的值中,则返回 1。
当使用 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 个参数,检查第 1 个参数是否等于 0.0,如果不为零则返回第 2 个参数,否则返回第 3 个参数。注意,与比较运算符不同,IF() 不 使用阈值!因此,使用比较结果作为第 1 个参数是安全的,但算术运算符可能产生意外结果。例如,以下两个调用即使逻辑上等价,结果也会不同:
- 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() 函数自身不带阈值地与零比较。然而,由于浮点计算精度有限,其值会略微不同于零。因此,IF() 对 0.0 的比较不会通过,第二种变体将返回 '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 个或更多参数,如果第一个参数(expr)等于其他任一参数(val1..valN),则返回 1,否则返回 0。目前,所有被检查的值(但不包括表达式本身)必须是常量。常量会被预先排序,并使用二分查找,因此即使是针对大量任意常量列表的 IN() 也会非常快。第一个参数也可以是 MVA 属性。在这种情况下,如果任何 MVA 值等于其他任一参数,IN() 将返回 1。IN() 还支持 IN(expr,@uservar) 语法,用于检查值是否属于给定全局用户变量中的列表。第一个参数可以是 JSON 属性。
INDEXOF(cond FOR var IN json.array) 函数遍历数组中的所有元素,返回第一个满足 'cond' 条件的元素的索引,如果数组中所有元素都不满足 'cond',则返回 -1。
INTERVAL(expr,point1,point2,point3,...) 接受 2 个或更多参数,返回第一个小于第一个参数的参数的索引:如果 expr<point1 返回 0,point1<=expr<point2 返回 1,依此类推。要求 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 的值可以用 日期数学 表达式表示。
用于聚合、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;
日期数学让您可以直接在搜索中处理日期和时间。它特别适用于处理随时间变化的数据。通过日期数学,您可以轻松完成诸如查找某一时期的条目、分析数据趋势或管理信息何时应被删除等操作。它简化了日期处理,允许您在搜索查询中对给定日期加减时间、将日期四舍五入到最近的时间单位等。
使用日期数学时,您从一个基准日期开始,该日期可以是:
now表示当前日期和时间,- 或以
||结尾的特定日期字符串。
然后,您可以用以下操作修改此日期:
+1y表示加一年,-1h表示减一小时,/m表示四舍五入到最近的月份。
您可以在操作中使用以下单位:
s表示秒,m表示分钟,h(或H)表示小时,d表示天,w表示周,M表示月,y表示年。
以下是一些日期数学的示例用法:
now+4h表示从现在起四小时。now-2d/d表示两天前的时间,四舍五入到最近的一天。2010-04-20||+2M/d表示2010年6月20日,四舍五入到最近的一天。
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}) 返回单字符编辑(插入、删除或替换)次数的数字(Levenshtein 距离),表示将 pattern 变为 source 所需的编辑次数。
pattern,source- 常量字符串、字符串字段名、JSON 字段名,或任何产生字符串的表达式(例如,SUBSTRING_INDEX())normalize- 选项,返回一个范围在[0.0 - 1.0]之间的浮点数距离,其中 0.0 表示完全匹配,1.0 表示最大差异。默认值为 0,表示不归一化,结果为整数。length_delta- 如果设置了该选项且字符串长度差异超过length_delta,则跳过 Levenshtein 距离计算,直接返回max(strlen(pattern), strlen(source))。默认值为 0,表示对任何输入字符串都计算 Levenshtein 距离。该选项在检查大致相似字符串时非常有用。
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() 函数被视为“后限制”函数,这意味着片段的计算会延迟到整个最终结果集准备好之后,甚至在应用 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 */