Oracle兼容-函数-LPAD()函数
1. 语法
LPAD(str,len)
LPAD(str,len,padstr)
2. 定义和用法
因为GreatSQL已原生支持 LPAD()
函数,因此想要在GreatSQL中使用扩展后的 LPAD()
函数时,需要先执行 SET sql_mode = ORACLE;
激活Oracle兼容模式。
在GreatSQL中,原生的 LPAD()
函数作用是对字符串 str
在其左边补齐字符串 padstr
,使其满足总长度为 len
个字符(注意,是字符长度,不是字节长度)。当 str
的长度已经超过 len
值时,则会被截取一部分长度。例如:
greatsql> SET sql_mode = DEFAULT;
greatsql> SELECT LPAD("a", 3, "b");
+-------------------+
| LPAD("a", 3, "b") |
+-------------------+
| bba |
+-------------------+
greatsql> SELECT LPAD("aaaa", 3, "b");
+----------------------+
| LPAD("aaaa", 3, "b") |
+----------------------+
| aaa |
+----------------------+
greatsql> SELECT LPAD("数据库", 8, "GreatSQL");
+----------------------------------+
| LPAD("数据库", 8, "GreatSQL") |
+----------------------------------+
| Great数据库 |
+----------------------------------+
而在Oracle模式中,函数 LPAD()
最少可以只有2个参数,则其行为是在字符串 str
的左边加上空格补齐,使得字符串最后的总长度为 len
值指定的长度。当参数为3个时,在字符串 str
的左边加上指定字符串 padstr
,使最后长度为 len
值指定的长度。
参数 len
值所指的是屏幕的显示长度,而不是字符串的总字符数或者字节数,其中中文字符视为2个字符长度,英文和半角符号视为1个字符长度。
如果要补充的只有一个字符长度,而需要补充的目标字符串为中文,则只会在左边补一个空格。
如果 len
值小于字符串 str
的长度,那么就删除字符串 str
右边的字符。当 str
字符串的长度剩余1个字符并且当前字符为中文的时候,左边补一个空格。如果 len
值为0,那么最后显示NULL。
3. Oracle兼容说明
当GreatSQL的字符集为utf8(utf8mb4/utf8mb3)时,多字节字符显示固定长度为2位,单字节固定显示为1位。此行为大部分结果和Oracle相同,只有少部分多字节字符或半角字符行为和Oracle不一致。
4. 示例
-- 先测试原生的LPAD()函数
greatsql> SET sql_mode = DEFAULT;
greatsql> SELECT LPAD('a', 3, 'b');
+-------------------+
| LPAD("a", 3, "b") |
+-------------------+
| bba |
+-------------------+
greatsql> SELECT LPAD('aaaa', 3, 'b');
+----------------------+
| LPAD("aaaa", 3, "b") |
+----------------------+
| aaa |
+----------------------+
-- 在DEFAULT模式下,每个中文字符长度视为1
greatsql> SELECT LPAD('数据库', 8, 'GreatSQL');
+----------------------------------+
| LPAD("数据库", 8, "GreatSQL") |
+----------------------------------+
| Great数据库 |
+----------------------------------+
-- 在DEFAULT模式下,LENGTH()函数计算每个中文长度为3字节
greatsql> SELECT LPAD('据b', 6, '数a'), length(LPAD('据b', 6, '数a'));
+-------------------------+---------------------------------+
| LPAD('据b', 6, '数a') | length(LPAD('据b', 6, '数a')) |
+-------------------------+---------------------------------+
| 数a数a据b | 12 |
+-------------------------+---------------------------------+
-- 参数至少要求3个
greatsql> SELECT LPAD("数据库", 8);
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'lpad'
-- 切换到Oracle模式
greatsql> SET sql_mode = ORACLE;
-- 每个中文字符长度视为2
-- 在Oracle模式下,LENGTH()函数计算每个中文长度为1个字符
greatsql> SELECT LPAD('据b', 6, '数a'), length(LPAD('据b', 6, '数a'));
+-------------------------+---------------------------------+
| LPAD('据b', 6, '数a') | length(LPAD('据b', 6, '数a')) |
+-------------------------+---------------------------------+
| 数a据b | 4 |
+-------------------------+---------------------------------+
-- 要左侧补齐的字符串长度只有1,且为中文,最后只补齐一个空格
greatsql> SELECT LPAD('据b', 6, '数据'), length(LPAD('据b', 6, '数据'));
+---------------------------+-----------------------------------+
| LPAD('据b', 6, '数据') | length(LPAD('据b', 6, '数据')) |
+---------------------------+-----------------------------------+
| 数据b | 4 |
+---------------------------+-----------------------------------+
-- 要左侧补齐的字符串长度只有1,且为中文,最后只补齐一个空格
greatsql> SELECT LPAD('数据库', 1), length(LPAD('数据库', 1));
+----------------------+------------------------------+
| LPAD('数据库', 1) | length(LPAD('数据库', 1)) |
+----------------------+------------------------------+
| | 1 |
+----------------------+------------------------------+
-- len = 0,返回NULL
greatsql> SELECT LPAD('数据库', 0);
+----------------------+
| LPAD('数据库', 0) |
+----------------------+
| NULL |
+----------------------+
问题反馈
联系我们
扫码关注微信公众号