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。
- 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> 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。
当使用 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> 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 中的版本略有不同。它接受三个参数,检查第一个参数是否等于 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() 函数本身以没有阈值的方式与零进行比较。然而,由于浮点计算精度有限,其值将略不同于零。因此,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,...) 接受两个或更多参数,并返回如果第一个参数 (expr) 等于其他参数中的任何一个 (val1..valN),则返回 1,否则返回 0。当前,所有检查的值(但不是表达式本身)都必须是常量。这些常量会被预先排序,并使用二分查找,因此即使面对一个大型任意列表,IN() 也会非常快速。第一个参数也可以是一个 MVA 属性。在这种情况下,IN() 将返回 1 如果任何 MVA 值等于其他参数中的任何一个。IN() 还支持 IN(expr,@uservar) 的语法来检查值是否属于给定的全局用户变量中的列表。第一个参数可以是一个 JSON 属性。
INDEXOF(cond FOR var IN json.array) 函数遍历数组中的所有元素,并返回第一个满足 'cond' 为真的元素的索引,如果没有元素满足 'cond' 则返回 -1。
INTERVAL(expr,point1,point2,point3,...) 接受两个或更多参数,并返回第一个参数小于该参数的参数的索引:如果 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。但使用 calendar_interval 不支持多单位,如 2d,而 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() 还接受可选的第五个参数,使您能够轻松地在输入和输出单位之间转换,并选择使用的具体地理距离公式。完整语法和几个示例如下:
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- 如果设置该选项且字符串长度差超过此值,则跳过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 */