oracle函数-LPAD/RPAD

基本用法:

lpad函数

函数介绍

lpad函数是Oracle数据库函数,lpad函数从左边对字符串使用指定的字符进行填充。从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思。

2语法

语法格式如下:

lpad( string, padded_length, [ pad_string ] )

string

准备被填充的字符串;

padded_length

填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;

pad_string

填充字符串,是个可选参数,这个字符串是要粘贴到string的左边,如果这个参数未写,lpad函数将会在string的左边粘贴空格。

示例1:

SQL> select lpad(‘abcde‘,10,‘x‘) from dual;

LPAD(‘ABCDE‘,10,‘X‘)

--------------------

xxxxxabcde

示例2:

SQL> select lpad(‘abcde‘,10,‘oq‘) from dual;

LPAD(‘ABCDE‘,10,‘OQ‘)

---------------------

oqoqoabcde

示例3:

SQL> select lpad(‘abcde‘,2) from dual;

LPAD(‘ABCDE‘,2)

---------------

ab

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

与lpad函数对应的是rpad函数:

rpad函数从右边对字符串使用指定的字符进行填充,语法格式与lpad格式相同:

rpad(string,padded_length,[pad_string])

string

被填充的字符串

padded_length

字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,rpad函数将会把字符串截取成从左到右的n个字符;

pad_string

是个可选参数,这个字符串是要粘贴到string的右边,如果这个参数未写,lpad函数将会在string的右边粘贴空格。

例如:

rpad(‘tech‘, 7); 将返回‘tech ‘

rpad(‘tech‘, 2); 将返回‘te‘

rpad(‘tech‘, 8, ‘0‘); 将返回‘tech0000‘

rpad(‘tech on the net‘, 15, ‘z‘); 将返回 ‘tech on the net‘

rpad(‘tech on the net‘, 16, ‘z‘); 将返回 ‘tech on the netz‘

陷阱处理:

首先看下Oracle官方对函数的定义:

The RPAD function returns an expression, right-padded to a specified length with the specified characters; or, when the expression to be padded is longer than the length specified after padding, only that portion of the expression that fits into the specified length.

RPAD函数将指定的字符串从目标字符串的右侧填充指定长度的字符串,若待填充的字符串的长度大于制定的填充长度,则会根据填充的长度对目标字符串进行截取。

函数语法

RPAD (text-exp , length [, pad-exp])

对Length填充长度的解释

关于对各个参数的解释,我们重点来看看length这个参数:

Length

The total length of the return value as it is displayed on your terminal screen. In most character sets, this is also the number of characters in the return value. However, in some multibyte character sets, the display length of a character string can differ from the number of characters in the string.

When you specify a value for length that is shorter than the length of text-exp, then this function truncates the expression to the specified length.

粗体部分大意为:返回值的总长度正如它们在你的终端屏幕上显示的长度一样,注意,是终端显示的长度,非该字符串在数据库中的实际显示长度(字节)。这在多字节支持的数据库(如简体中文,AL32UTF8等等)中尤为明显。

通过下面的一个示例来理解一下这句话:

SQL> SELECT ‘甲骨文‘ ORA_STR,
  2         LENGTHB(‘甲骨文‘) ORA_STR_LENGTH,
  3         RPAD(‘甲骨文‘, 10, ‘$‘) ORA_RPAD_STR,
  4         LENGTHB(RPAD(‘甲骨文‘, 10, ‘$‘)) ORA_RPAD_STR_LENGTH
  5    FROM dual
  6  ;

ORA_STR   ORA_STR_LENGTH ORA_RPAD_STR  ORA_RPAD_STR_LENGTH
--------- -------------- ------------- -------------------
甲骨文                 9 甲骨文$$$$                     13

SQL> 

我的数据库的字符集是AL32UTF8,所以一个中文字符占3个字节。在这个例子中,LENGTHB函数对字符串“甲骨文”的字节长度计算很准确,为9个字节,但是你会发现,我们用RPAD函数向字符串”甲骨文“后面填充$符号,总长度为10时,结果范围的却是”甲骨文$$$$",并不是我们期望得到的值"甲骨文$",同时也会发现,截取完后的字符串长度也并不是10个字节。

我们回到官方定义中对于返回长度Length的解释,这个长度取决于当前字符在屏幕终端显示时所占据的大小,对于中文来说,通常在屏幕上占据的是2个字节的宽度:

因此RPAD在进行填充的时候对这些字符按照两个字节去处理,所以出现了上述示例所描述的情况。这种不可预知(Sometimes)的情况对于那些输出固定字节宽度的程序来说无疑会产生问题。

解决方法

下面是针对这种问题的解决方法:

SQL> SELECT ‘甲骨文‘ ORA_STR,
  2         LENGTHB(‘甲骨文‘) ORA_STR_LENGTH,
  3         RPAD(‘甲骨文‘, 10, ‘$‘) ORA_RPAD_STR,
  4         LENGTHB(RPAD(‘甲骨文‘, 10, ‘$‘)) ORA_RPAD_STR_LENGTH,
  5         -- 解决方法
  6         SUBSTRB(‘甲骨文‘ || RPAD(‘$‘, 10, ‘$‘), 1, 10) SOLUTION
  7    FROM dual
  8  ;

ORA_STR   ORA_STR_LENGTH ORA_RPAD_STR  ORA_RPAD_STR_LENGTH SOLUTION
--------- -------------- ------------- ------------------- ----------
甲骨文                 9 甲骨文$$$$                     13 甲骨文$

SQL> 

在实际应用中,我们可以将上述方法抽象为一个函数来使用:

CREATE OR REPLACE
FUNCTION rpad2(str IN VARCHAR2,
               len IN PLS_INTEGER,
               pad IN VARCHAR2)
  RETURN VARCHAR2
IS
BEGIN
  RETURN SUBSTRB(str || RPAD(pad, len, pad), 1, len);
END rpad2;

使用范例:

SQL> SELECT rpad2(‘甲骨文‘, 10, ‘$‘) PADDED_VALUE FROM DUAL;

PADDED_VALUE
-----------------------
甲骨文$

SQL> 

参考链接

  1. Oracle Bug? RPAD of Japanese (kanji) character in Oracle 10gR2 UTF8 database
  2. Issue with LPAD/RPAD when using with Japanese data
  3. Oracle Documentation - RPAD
时间: 2024-08-05 19:16:12

oracle函数-LPAD/RPAD的相关文章

oracle中填充函数lpad/rpad的使用

Lpad 1.语法 Lpad(string,pad_length,[pad_str]) 2.解释 该函数表示从字符串的左边开始填充指定的字符到指定的长度.字符串的空格也是算入长度中的. string:要填充的字符串 pad_length:填充后的字符串的长度,如果该值比原字符串的长度还要小,则返回的是从字符串的左侧开始截取的该长度后的字符串. pad_str:要填充的字符串,可选函数,如果没有值,则以空格填充左边. 例子1: select lpad('abc','5','@') from dua

oracle函数 LPAD(c1,n[,c2])

[功能]在字符串c1的左边用字符串c2填充,直到长度为n时为止 [参数]C1 字符串 n 追加后字符总长度 c2 追加字符串,默认为空格 [返回]字符型 [说明]如果c1长度大于n,则返回c1左边n个字符 如果如果c1长度小于n,c2和c1连接后大于n,则返回连接后的右边n个字符 [示例] SQL> select lpad('gao',10,'*') from dual; lpad('gao',10,'*') ----------------- *******gao 不够字符则用*来填满 [相似

Oracle中的填充函数lpad和rpad的用法(转)

原文链接:http://blog.csdn.net/myzhanglt/article/details/7392999 今日学习遇到一个不熟悉的函数LPAD,查了一下文档,将其用法总结如下: Lpad Function:在PL/SQL中用于往源字符串的左侧填充一些字符. 函数参数:lpad( string1, padded_length, [ pad_string ] ) 其中 string1:源字符串 padded_length:最终返回的字符串的长度,如果最终返回的字符串的长度比源字符串的小

Oracle中Lpad函数和Rpad函数的用法

http://blog.csdn.net/woshixuye/article/details/17262307 一.Lpad函数 lpad函数将左边的字符串填充一些特定的字符其语法格式如下:lpad(string,n,[pad_string]) string字符或者参数 n字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符; pad_string可选参数,这个字符串是要粘贴到string的左边,若这个参数未写,lpad函数将会在s

【函数】Oracle函数系列(1)--字符函数

[函数]Oracle函数系列(1)--字符函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 常见字符函数(lower.upper.initcap.concat.substr.length.intr.lpad.rpad.trim.chr.ascii.replace.translate)的使用 ② 判断字符串中是否含有汉字 ③ substr和instr的联合使用 ④

[转]ORACLE函数大全

SQL中的单记录函数 1.ASCII返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A         A      ZERO     SPACE--------- --------- --------- ---------       65        97        48        32 2.CHR给出整数,返回对应的字符;SQL>

ORACLE函数大全

SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A         A      ZERO     SPACE --------- --------- --------- ---------        65        97        48        32 2.CHR 给出整数,返回对应的字符;

Oracle函数-高阶篇

下面整理了部分oracle函数-高阶篇: 1. CATSTR    举例:SELECT CATSTR(COLUMN_NAME) NAME_LIST FROM DBA_TAB_COLUMNS WHERE TRIM(TABLE_NAME) = 'T_RZ_DKDATA'  --查询出的结果在一个列中2. INSTR() 检索字符串函数:匹配则返回首次检索的位置的索引值(从1开始),值>0,否则返回值=0    举例:SELECT * FROM USER_TABLES WHERE INSTR(TABL

ORACLE函数之单行字符函数

 1.           ASCII(C) 说明:返回C的首字符在ASCII码中对应的十进制 举例: SQL>SELECT ASCII('A') A,ASCII('a') B,ASCII('0') C,ASCII(' ') D FROM DUAL; A         B          C         D -------------------- ---------- ---------- 65        97         48        32 2.         C