随着整个社会信息化的飞速发展,审计工作中计算机技术发挥着越来越重要的用,如:提高审计工作精确性、加强审计工作管理、提升数据透明性和分享性等。数据库技术可以说是计算机审计中的核心技术,它是被审单位(例如商业银行、国有企业等)中最具有战略性的资产之一。数据库中存有与被审计单位经营活动密切相关的信息,因此熟悉并使用审计工作中常遇到的数据库管理系统(ACCESS、SQL SERVER和ORACLE)是成为一名优秀审计人员的必备条件。其常用系统函数有较多差异,笔者对三种主流数据库管理系统中SQL语句应用差异性进行了总结,避免在实际审计工作中错用和混淆SQL语句影响工作效率。
一、字符串操作函数
审计工作中,发现经常要用到字符串操作函数。例:查找1986年出生的人,出生字段为YYYYMMDD,那么就要截取该字段字符串前4位进行判断等等。
1.截取字符串(返回字符串中从start开始的length长度个字符)函数:
ACCESS:
Mid(字符串,start,length),例:mid("abcd",1,2) 返回"ab"。
SQL SERVER:
Substring(字符串,start, length),例:substring ( ‘abcd’ , 1,2) 返回"ab"。
ORACLE:
Substr(字符串,start, length),例:substr( "abcd" , 1,2) 返回"ab"。
2.返回大写字母函数:
ACCESS:
Ucase(字符串)。例:Ucase("abc"),返回”ABC”。
SQL SERVER:
Upper(字符串)。例:Upper (‘abc’),返回”ABC”。
ORACLE:
Upper(字符串)。例:Upper (‘abc’),返回”ABC”。
3.返回小写字母函数:
ACCESS:
Lcase(字符串)。例:Lcase("ABC"),返回"abc"。
SQL SERVER:
Lower(字符串)。例:Lower(‘ABC’),返回"abc"。
ORACLE:
Lower(字符串)。例:Lower(‘ABC’),返回"abc"。
4.查询子串在字符串中出现的位置函数:
ACCESS:
InStr(字符串1,字符串2)。例:InStr("abc","b"),返回2,字符串2为子串。
SQL SERVER:
CharIndex(字符串2,字符串1[,start])。例:CharIndex (‘b’,‘abcbcb’,3),返回4,字符串2为子串。start参数若省略则从位置0开始搜索。
ORACLE:
InStr(字符串1,字符串2,[,start1[,start2]])。从字符
串1的第start1个字符开始搜索字符串2在字符串1中
第start2次出现的位置。例:InStr("abcbcbc","b",2,2),
返回4。
5.字符串连接函数:
ACCESS:
&。例:a&b,返回ab。
SQL SERVER:
+。例:a+b,返回ab。
ORACLE:
||。例:a||b,返回ab。
二、时间函数
取当前系统时间,实际工作中经常要构造当前时间字段来确认操作时间。
ACCESS:
select Now()。
SQL SERVER:
select Getdate()。
ORACLE:
select sysdate for dual。
三、数据类型转换函数,审计工作中经常要将各种类型数据进行转换,偏于显示和计算。
ACCESS:
CBool(expression),CByte(),CCur(),CDate(),CDbl( ) CDec( ),CInt( ),CLng( ),CSng( ),CStr( ),CVar( ),函数参数同CBool。
SQL SERVER:
(1)Cast(<expression> as <data_type>[ length ])。例:Cast(1234 as vachar(20)),返回可变长字符串’1234’。
(2)Convert(<data_ type>[ length ], <expression> [,style])。前两个参数位置同Cast相反,用法相同,第三个参数style可选择输出格式。例: Convert(varchar(30), getdate(), 101),返回11/01/ 2011;Select Convert (varchar(30), getdate(),102),返回2011.11.01,即日期格式不同。
ORACLE:
To_date(字符串[, ‘style’])。style为格式。例:
To_date(‘2011-08-02 21’, ‘YYYY-MM-DD HH24’)。
To_numeber(字符串[, ‘style’])。例: To_numeber (’RMB234567.1230’, ‘L999999.000’),返回234567.123。
To_char(数字或时间[, ‘style’])。例:To_char(sysdate, ‘yyyy-mm-dd’),返回2011-08-02。
四、判断取值函数,判断取值是经常要用到的语句,在不同情况下进行不同的操作
ACCESS:
Iff(判断条件,值1,值2)。如果满足条件则取值1,否则取值2。例:Iff(len(title))10,left(title,10),title),如果title长度大于10则取前10个字符,否则取原值。
SQL SERVER:
CASE WHEN 判断条件 THEN 值1 [WHEN ...] [ELSE 值n] END。例:CASE WHEN sex =‘0’ THEN ‘男’ WHEN sex = ‘1’ THEN ‘女’ ELSE ‘性别错误’ END。如果变量sex为0则为男,如果为1则为女,否则性别输入错误。
ORACLE:
DECODE(变量, 判断条件1, then 值1, 判断条件2,then 值2, 判断条件3, then 值3,……,值n )。例:DECODE(oprater, 1, ‘+’, 2, ‘-’, 3, ‘*’, 4, ‘/’, ‘其它运算符’)。
五、求日期相差天数函数,在审计国税相关部门时,要计算滞纳金等数据就要计算延期交税的天数,因此要用到日期相差天数函数。
ACCESS:
Datediff(interval, date1, date2[, firstdayofweek [,firstweekofyear]])。Interval为间隔参数,计算date1与date2之间(data2-data1)的间隔,first dayofweek可选。指定一个星期的第一天。如果未予指定,则以星期日为第一天。firstweekofyear可选。指定一年的第一周。如果未予指定,则以包含 1 月 1 日的星期为第一周。例:DateDiff ("d","2010/1/1", "2011/1/1"),返回现在与2010年1月1日相差的365天。
SQL SERVER:
Datediff(interval, date1, date2)。参数含义同ACCESS,但请注意参数取值和格式。例:SELECT Datediff(day,‘2010/1/1’, ‘2011/1/1’),同样返回365天。
ORACLE:
ORACLE中没有类似Datediff的函数,但可以用日期转换函数to_date直接相减。例:to_date(‘2010-1-1’, ‘yyyy-mm-dd’) - to_date(‘2011-1-1’, ‘yyyy-mm- dd’),同样返回365天。
六、生成新表语句,审计工作中经常要将疑点数据生成新的表格,因此要用到生成新表语句。
ACCESS:
Insert into a (select * from b),会报错!应将两端括号去掉:Insert into a select * from b。
SQL SERVER:
有无两端括号均正确。
ORACLE:
有无两端括号均正确。