Oracle PL/SQL Programming 读书笔记(Strings)
Working with Strings
1.常量字符串:
单引号(')在字符串中用两个来表示('')
10G 中可以用 q' 来表示字符串的开始和结束:q'!fjsk'djfd!' or q'[kdfjs'kdlfj]'
2.ASCII代码:
CHR(10) 返回 ASCII 码对应的字符
ASCII(char(1)) 返回对应的 ASCII 码
3.字符串操作:
CONCAT(char,char) = char||char 连接字符串
LOWER UPPER INITCAP 大小写处理,INITCAP 将字符串中每个单词的开头字母大写。
NLS_COMP NLS_SORT 参数指定字符串的比较和排序规则,默认都是 BINARY,根据二进制转换后的结果进行比较和排序。可以在 session 或整个数据库层面改变该参数,来影响比较和排序的结果,还可以用 NLSSORT 函数。
补充:NLS_SORT/NLSSORT 非常有用,比如需要按照拼音顺序排列可以通过下面的语句实现:
select descr from dmdunit order by nlssort(descr,'NLS_SORT = GBK')
当然也可以在 session / database 级别设置 NLS_SORT 参数来实现。后面的 nlspara 可以通过查询 V$NLS_VALID_VALUES 来获得(也可以查看 Globalization Support Guide 附录中的 Locale Data 的 Linguistic Sorting,9.2 的文档地址为 http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96529/appa.htm#958872),在 10g 中,还可以在后面加后缀 _CI (case insensitivity) or _AI (accent-insensitive and case-insensitive),10g 之前好像不行,只能通过 upper/lower 来忽略大小写了。更详细的可以查看 Globalization Support Guide 或者 http://www.oracle.com/technology/tech/globalization/index.html
LPAD/RPAD(string,n[,char]) 将 string 用 char 向左/向右不足 n 位,char 不指定则用空格,如果 n 小于 string 长度,会将 string 从左/从右截断。
LTRIM/RTRIM(string[,set]) 将 string 左边/右边的 set 删除,set 不指定则将空格删除。
一种有趣的用法:
DECLARE
a VARCHAR2(40) := 'This sentence has too many periods......';
b VARCHAR2(40) := 'The number 1';
BEGIN
DBMS_OUTPUT.PUT_LINE( RTRIM(a,'.') );
DBMS_OUTPUT.PUT_LINE(
LTRIM(b, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz')
);
END;
And the output is:
This sentence has too many periods
1
TRIM([leading/trailing/both] trim_char from source_string)
trim_char 为需要去掉的字符,如果不指定 [leading/trailing/both] 默认为 both。
4.查找、提取、替代字符串:
INSTR(string,substring[,position,occurrence])
position 为负数的话,从字符串末尾向开头查找,返回的结果依然是从开头开始计数。
SUBSTR(string,position[,substring_length])
position 为负数的话,从字符串末尾开始计数,然后再向末尾取子串。
REPLACE(string,search_string[,replacement_string])
replacement_string 不指定的话,相当于删除 search_string
5.空字符
pl/sql:
declare ch char(10):='';
vch varchar2(10):=''
ch is null --false,因为自动扩展为 10 个空格
vch is null --true
'' is null --true
sql:
create table vc (ch char(2), vch varchar2(2));
insert into vc values('','');
commit;
select * from where ch is null or vch is null; --返回行
select * from where ch ='' or vch ='' or ch=' '; --不返回行
6.char/varchar2 操作、比较
char 赋值给 varchar2 末尾空格保留
varchar2 赋值给 char 自动填补末尾空格
当 char 和 char 比较时,自动将长度短的 char 末尾补空格至和较长的长度相等,再比较(在 '' 中的字符串属于固定长度字符串,因此,属于 char)
当 char 和 varchar2 比较时,不会补充长度,直接比较。
(注:补充空格只是在比较时,不会真正把字符串补充长度。)
例子:
DECLARE
company_name CHAR(30):= 'Feuerstein and Friends';
char_parent_company_name CHAR(35):= 'Feuerstein and Friends';
varchar2_parent_company_name VARCHAR2(35):= 'Feuerstein and Friends';
company_name = char_parent_company_name --true,company_name 补充到 35 个字符再比较
company_name = varchar2_parent_company_name --false
create table vc(a char(10),b varchar2(10));
insert into vc values('fd','fd');
commit;
select * from vc where a=b; --不返回行,a 为 'fd ',b 为 'fd'
select * from vc where a='fd'; --返回行,'fd' 自动补充空格至 10 个字符。
create table cc(a char(2),b char(5));
insert into cc values('f','f');
commit;
select * from cc where a=b; -- 返回行,a 自动补充至 5 个字符
Posted by Sky at 05:41 PM | Permalink | Edit | Database