本文介绍GBase 8a数据库集群里,用于截取字符串的函数substr,substring、MID的语法和样例,同时也对相关的函数做介绍,以便实现截取指定位置,指定长度的字符串。
目录导航
语法
其中substr是substring的缩写形式,无任何区别。
SUBSTR(str,pos)
SUBSTR(str,pos,len)
SUBSTRING(str,pos)
SUBSTRING(str,pos,len)
MID(str,pos,len)
str 原始字符串
pos 起始位置,从1开始,也就是第一个字符开始,参数就是1。
len 截取指定长度
说明
- 没有 len 参数的 SUBSTR()函数从字符串 str 的 pos 位置返回剩余全部子串。
- 带有 len 参数的 SUBSTR()函数从字符串 str 的 pos 位置起返回 len 个字符的子串。
- pos 可以是负值。在这种情况下,子串的起始位置是从字符串的尾部向前的pos 位置。
- 如果 len 为小于 1 的值,返回结果始终为空串。
MID等同于SUBSTRING(str,pos,len)
样例
截取字符串到末尾
只指定了开始位置,截取到字符串末尾。同时substring和substr是完全一样的,后续样例以substr为例。
gbase> select substring('abcdefghijk',8);
+----------------------------+
| substring('abcdefghijk',8) |
+----------------------------+
| hijk |
+----------------------------+
1 row in set (Elapsed: 00:00:00.01)
gbase> select substr('abcdefghijk',8);
+-------------------------+
| substr('abcdefghijk',8) |
+-------------------------+
| hijk |
+-------------------------+
1 row in set (Elapsed: 00:00:00.00)
数字字符串更清晰的看到起始位置从1开始
gbase> select substr('1234567890',8);
+------------------------+
| substr('1234567890',8) |
+------------------------+
| 890 |
+------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select substring('1234567890',8);
+---------------------------+
| substring('1234567890',8) |
+---------------------------+
| 890 |
+---------------------------+
1 row in set (Elapsed: 00:00:00.00)
截取指定长度
如下样例指定只读取从开始位置后的2个字符。
gbase> select substr('1234567890',8,2);
+--------------------------+
| substr('1234567890',8,2) |
+--------------------------+
| 89 |
+--------------------------+
1 row in set (Elapsed: 00:00:00.00)
起始位置为0
位置0和位置1返回相同的结果。
gbase> select substr('1234567890',0,2);
+--------------------------+
| substr('1234567890',0,2) |
+--------------------------+
| 12 |
+--------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select substr('1234567890',1,2);
+--------------------------+
| substr('1234567890',1,2) |
+--------------------------+
| 12 |
+--------------------------+
1 row in set (Elapsed: 00:00:00.00)
起始位置超过长度最大值
返回空字符串
gbase> select substr('1234567890',100,2);
+----------------------------+
| substr('1234567890',100,2) |
+----------------------------+
| |
+----------------------------+
1 row in set (Elapsed: 00:00:00.00)
起始位置为负数
从尾部开始,反向计算。
gbase> select substr('1234567890',-1,2);
+---------------------------+
| substr('1234567890',-1,2) |
+---------------------------+
| 0 |
+---------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select substr('1234567890',-2,2);
+---------------------------+
| substr('1234567890',-2,2) |
+---------------------------+
| 90 |
+---------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select substr('1234567890',-3,2);
+---------------------------+
| substr('1234567890',-3,2) |
+---------------------------+
| 89 |
+---------------------------+
1 row in set (Elapsed: 00:00:00.00)
等同于从length(str)+1开始。比如-1等同于(length(str)+1) -1。对比一下
gbase> set @str='1234567890';
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> select @str,substr(@str,-2,2),substr(@str,(length(@str)+1)-2,2);
+------------+-------------------+-----------------------------------+
| @str | substr(@str,-2,2) | substr(@str,(length(@str)+1)-2,2) |
+------------+-------------------+-----------------------------------+
| 1234567890 | 90 | 90 |
+------------+-------------------+-----------------------------------+
1 row in set (Elapsed: 00:00:00.00)
长度超过最大值
超过末尾的长度,最终是返回到末尾。
gbase> select substr('1234567890',10,20);
+----------------------------+
| substr('1234567890',10,20) |
+----------------------------+
| 0 |
+----------------------------+
1 row in set (Elapsed: 00:00:00.00)
长度为0
长度为0时,返回空字符串。
gbase> select substr('1234567890',10,0);
+---------------------------+
| substr('1234567890',10,0) |
+---------------------------+
| |
+---------------------------+
1 row in set (Elapsed: 00:00:00.00)
长度为负数
gbase> select substr('1234567890',10,-2);
+----------------------------+
| substr('1234567890',10,-2) |
+----------------------------+
| |
+----------------------------+
1 row in set (Elapsed: 00:00:00.00)
参数为NULL
无论是原始字符串,还是起始位置,长度,任何一个为null,则返回null.
gbase> select substr('1234567890',10,null);
+------------------------------+
| substr('1234567890',10,null) |
+------------------------------+
| NULL |
+------------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select substr('1234567890',null,-2);
+------------------------------+
| substr('1234567890',null,-2) |
+------------------------------+
| NULL |
+------------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select substr(null,10,-2);
+--------------------+
| substr(null,10,-2) |
+--------------------+
| NULL |
+--------------------+
1 row in set (Elapsed: 00:00:00.00)
MID函数
和substring(str,pos,len)完全一样。
gbase> select mid('12345678',3,4);
+---------------------+
| mid('12345678',3,4) |
+---------------------+
| 3456 |
+---------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select substring('12345678',3,4);
+---------------------------+
| substring('12345678',3,4) |
+---------------------------+
| 3456 |
+---------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase>