南大通用GBase 8a截取字符串函数substr、substring、MID介绍和样例

本文介绍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>

参考

GBase 8a字符串和日期函数列表索引