3.1.3 字符函数
字符函数用于字符数据的处理,例如字符串的拼接、大小写转换、子串的查找和替换等。表3.2列出了常见的SQL字符函数及它们在5种主流数据库中的实现。
表3.2 常见的SQL字符函数与实现
续表
下面我们通过一些示例来说明这些函数的作用和注意事项。
1.字符串的长度
字符串的长度可以按照两种方式进行计算:字符数量和字节数量。在多字节编码中,一个字符可能占用多个字节。
CHAR_LENGTH(s)函数用于计算字符串中的字符数量,OCTET_LENGTH(s)函数用于计算字符串包含的字节数量,例如:
查询返回的结果如下:
字符串“数据库”包含3个字符,在UTF-8编码中占用9个字节。MySQL和PostgreSQL实现了这两个标准函数。
Oracle使用LENGTH(s)函数和LENGTHB(s)函数计算字符数量和字节数量,例如:
查询返回的结果和上面的示例相同。
提示:PostgreSQL也提供了LENGTH(s)函数,用于返回字符串中的字符数量。MySQL也提供了LENGTH(s)函数,用于返回字符串中的字节数量。
Microsoft SQL Server使用LEN(s)函数和DATALENGTH(s)函数计算字符数量和字节数量,例如:
查询返回的结果如下:
字符串“数据库”在“Chinese_PRC_CI_AS”字符集中占用6个字节,每个汉字占用2个字节。
SQLite只提供了LENGTH(s)函数,用于计算字符串中的字符个数,例如:
查询返回的结果如下:
2.连接字符串
CONCAT(s1,s2,…)函数将两个或者多个字符串连接到一起,组成一个新的字符串,例如:
查询返回的结果如下:
Oracle中的CONCAT函数一次只能连接两个字符串,例如:
我们通过嵌套函数调用连接多个字符串,查询返回的结果和上面的示例相同。
SQLite没有提供连接字符串的函数,可以通过连接运算符(||)实现字符串的连接,例如:
查询返回的结果和上面的示例相同。
Oracle和PostgreSQL也提供了连接运算符(||),Microsoft SQL Server使用加号(+)作为连接运算符。
除CONCAT函数外,还有一个CONCAT_WS(separator,s1,s2,…)函数,可以使用指定分隔符连接字符串,例如:
查询返回的结果如下。
MySQL、Microsoft SQL Server以及PostgreSQL实现了该函数。
3.大小写转换
LOWER(s)函数将字符串转换为小写形式,UPPER(s)函数将字符串转换为大写形式,例如:
查询返回的结果如下:
提示:MySQL中的LCASE函数等价于LOWER函数,UCASE函数等价于UPPER函数。Oracle和PostgreSQL还提供了首字母大写的INITCAP函数。
4.获取子串
SUBSTRING(s,n,m)函数返回字符串s中从位置n开始的m个字符子串,例如:
查询返回的结果如下:
Oracle使用简写的SUBSTR(s,n,m)函数返回子串,例如:
MySQL、PostgreSQL以及SQLite也支持SUBSTR函数。查询结果和上面的示例相同。
另外,Oracle、MySQL以及SQLite中的起始位置n可以指定负数,表示从字符串的尾部倒数查找起始位置,然后再返回子串,例如:
查询返回的结果如下。
其中,-2表示从右往左数第2个字符(“据”),然后再返回2个字符。
提示:MySQL、Microsoft SQL Server以及PostgreSQL提供了LEFT(s,n)和RIGHT(s,n)函数,分别用于返回字符串开头和结尾的n个字符。
5.子串查找与替换
INSTR(s,s1)函数查找并返回字符串s中子串s1第一次出现的位置。如果没有找到子串,则会返回0,例如:
查询返回的结果如下:
“@”是字符串“liubei@shuguo.com”中的第7个字符。
Microsoft SQL Server使用PATINDEX(s1,s)函数查找子串的位置,例如:
其中,s1参数的形式为%pattern%,类似于LIKE运算符中的匹配模式。查询返回的结果和上面的示例相同。
PostgreSQL使用POSITION(s1 IN s)函数查找子串的位置,例如:
查询返回的结果和上面的示例相同。
REPLACE(s,old,new)函数将字符串s中的子串old替换为new,例如:
查询返回的结果如下:
REPLACE函数在5种主流数据库中的实现一致。
6.截断字符串
TRIM(s1 FROM s)函数删除字符串s开头和结尾的子串s1,例如:
第一个函数删除了开头和结尾的“-”;第二个函数省略了s1子串,默认表示删除开头和结尾的空格。查询返回的结果如下:
Oracle中的参数s1只能是单个字符,其他数据库中的参数s1可以是多个字符。
SQLite中的TRIM(s,s1)函数的调用格式与其他数据库不同,例如:
查询返回的结果和上面的示例相同。
提示:LTRIM(s)函数可以删除字符串开头的空格,RTRIM(s)函数可以删除字符串尾部的空格,这两个函数是TRIM函数的简化版。