简单实用的sql小技巧(第二篇)(r3笔记第86天)

作者: admin 分类: 公众号存档            0 次浏览 发布时间: 2014-12-16 22:27

公众号:杨建荣的学习笔记 · 作者:r3笔记第86天 · 发布:2014-12-16 22:27:32 · 原文链接

ASCII和CHR
在平时的工作中,可能会在sql或者pl/sql块中嵌入特殊字符,比如空格,回车之类。这个时候可以使用ascii和chr来做字符和ascii码的转换。
比如我们想得到字母a对应的ascii码,可以使用ascii来实现。
SQL> select ascii(‘a’) from dual;
ASCII(‘A’)
———-
97
如果反推,需要根据ascii码值来得到对应的字符,就可以使用chr
SQL> select chr(97) from dual;
CHR

a
关于ascii码对应的字符,总结的列表如下。对于前32个ascii码来说,是不可见字符。所以使用描述代替。这部分特殊字符在平时的工作中使用的地方还是比较多的。像回车符,换行符,空格都很常用。
用到的时候可以参考一下。

ascii码 对应的字符 ascii码 对应的字符
0 null 64 @
1 start of heading 65 A
2 start of text 66 B
3 end of text 67 C
4 end of transmission 68 D
5 enquiry 69 E
6 acknowledge 70 F
7 bell 71 G
8 backspace 72 H
9 horizontal tab 73 I
10 new line 74 J
11 vertical tab 75 K
12 new page 76 L
13 carriage return 77 M
14 shift out 78 N
15 shift in 79 O
16 data link escape 80 P
17 device control 1 81 Q
18 device control 2 82 R
19 device control 3 83 S
20 device control 4 84 T
21 negative acknowledge 85 U
22 synchronous idle 86 V
23 end of trans. block 87 W
24 cancel 88 X
25 end of medium 89 Y
26 substitute 90 Z
27 escape 91 [
28 file separator 92 \
29 group separator 93 ]
30 record separator 94 ^
31 unit separator 95 _
32 space 96 `
33 ! 97 a
34 98 b
35 # 99 c
36 $ 100 d
37 % 101 e
38 & 102 f
39 103 g
40 ( 104 h
41 ) 105 i
42 * 106 j
43 + 107 k
44 , 108 l
45 109 m
46 . 110 n
47 / 111 o
48 0 112 p
49 1 113 q
50 2 114 r
51 3 115 s
52 4 116 t
53 5 117 u
54 6 118 v
55 7 119 w
56 8 120 x
57 9 121 y
58 : 122 z
59 ; 123 {
60 < 124 |
61 = 125 }
62 > 126 ~
63 ? 127 DEL

DUMP
对于一些特殊字符,有些是不可见字符,如果在客户端查看根本判断不出来。这个时候一旦出现什么问题,可以根据dump来查看是否存在特殊字符。举个简单的例子。
create table test(id number,name varchar2(100));
insert into test values(1,’this is a test’);
insert into test values(2,’this is a test’||chr(10));
commit;
SQL> col dump_name format a100
SQL> col name format a30
SQL> select *from test; –通过客户端查看,根本看不出区别来。一旦出现问题是很难查的。
ID NAME
———- ——————————
1 this is a test
2 this is a test
SQL> select id,dump(name)dump_name from test; -使用dump来解析,最后的”10“就是不可见字符,是一个换行符。
ID DUMP_NAME
———- —————————————————————————————————-
1 Typ=1 Len=14: 116,104,105,115,32,105,115,32,97,32,116,101,115,116
2 Typ=1 Len=15: 116,104,105,115,32,105,115,32,97,32,116,101,115,116,10

TO_CHAR (DATE)
关于to_char的使用,功能还是很强大的。看似简单的一个转换竟然能够实现很复杂的逻辑。
比如我们先得到当前的时间戳。

SQL> select to_char(sysdate,’yyyy–mm-dd hh24:mi:ss’) now_date from dual;
NOW_DATE
————————————————————
2014–12-16 17:46:39

得到这个月最后一天的信息,如果是在复杂的业务逻辑中判断能省去不少事。
SQL> select last_day(sysdate) from dual;
LAST_DAY(SYSDATE)
——————
31-DEC-14
查看今天是这周的第几天。
SQL> select to_char(sysdate,’d’) from dual;
TO_

3
查看今天是星期几。
SQL> select to_char(sysdate,’day’) from dual;
TO_CHAR(SYSDATE,’DAY’)
—————————
tuesday
SQL> select to_char(sysdate,’dy’) from dual;
TO_CHAR(S
———
tue
查看今天是一年中的第几天
SQL> select to_char(sysdate,’ddd’) from dual;
TO_CHAR(S
———
350
查看今天是这个月的第几天
select to_char(sysdate,’dd’) from dual;
TO_CHA
——
16
查看今天是一年中的第几周
SQL> select to_char(sysdate,’ww’) from dual;
TO_CHA
——
50
查看月份
SQL> select to_char(sysdate,’MM’) from dual;
TO_CHA
——
12
select to_char(sysdate,’mm’) from dual;
TO_CHA
——
12
今天属于当月的第几周。
SQL> select to_char(sysdate,’W’) from dual;
TO_

3

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注