因为长期使用SQL Server和MySQL数据库,现在因为工作原因使用Oracle数据库时难免会有些不同,特此记录,持续更新。
1. 调用函数不能够直接SELECT不能够像MS或SS那样直接SELECT 1+1
或者SELECT CONCAT('','')
正确做法是:
SELECT 1+1,CONCAT('A','B') FROM dual;
Oracle中CONCAT
函数只能有两个参数,如果需要连接多个字符串,需要嵌套,如下:
SELECT CONCAT(CONCAT('A', 'B'),'C') FROM dual;
SELECT CONCAT(CONCAT(CONCAT('A', 'B'),'C'),'D') FROM dual;
由于CONCAT
函数中的参数由单引号分隔,因此如何在CONCAT
函数的结果中添加单引号字符并不简单。
SELECT CONCAT('Let''s', ' Go') FROM dual;
-- 输出为: Let's Go
在 Oracle中,||
运算符可以将两个或两个以上的字符串连接在一起。
SELECT 'This ' || 'is ' || 'test ' FROM dual;
-- 输出为: This is test
在Oracle中,Initcap()
函数可以将每个单词中的第一个字符设置为大写,其余的设置为小写。
SELECT INITCAP('VERSION HUANG in hangzhou') FROM dual;
-- 输出为: Version Huang In Hangzhou
在SQLServer中,对空值的处理可以使用ISNULL()
函数来处理,在Oracle中也有相同的方法,不过函数名为NVL()
,具体操作如下:
SELECT NVL(NULL, 5) FROM dual;
-- 输出为:5
在开发中经常会获取当前系统时间,在SQLServer中,通常使用GETDATE()
方法,而在Oracle中,则使用SYSDATE
关键字。
SELECT SYSDATE FROM dual;
-- 输出为:2021/5/18 15:02:12
而对时间进行格式化的方法,则使用TO_CHAR()
函数:
SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd=>hh:mm:ss') FROM dual;
-- 输出为:2021-05-18=>03:05:58
在SQLServer中,判断一个表是否存在时,会使用IF OBJECT_ID('xxx') IS NOT NULL
方法来查询,在Oracle中也有相同的方法,不过写法具体操作如下:
SELECT COUNT(1) FROM user_tables WHERE table_name = 'MF_FACTORY_BASE';
-- 当表存在时输出为1;其中COUNT(1)可根据需要替换
在SQLServer中,查询表的前几行数据时,会使用TOP
关键字来查询,在Oracle没有类似关键字,但可以通过ROWNUM
关键字来筛选:
SELECT *
FROM (SELECT * FROM MF_FACTORY_BASE ORDER BY ID)
WHERE ROWNUM <= 10;