Oracle基础之单表查询

平时用惯了PostgreSQL和MS SQL Server,因目前要做数据库兼容,因此主流Oracle便成了首个要克服的坎,以下是初用Oracle时掉入的一些坑,借此记录一下:

1. where条件中不允许直接拿类似 ** = '2020-3-17 17:18:25' ,Oracle里要用日期赋值或进行比较时,必须要用 to_date函数:

to_date('2020-03-17 10:40:10.345', 'yyyy-MM-dd HH24:MI:ss.ff')

2. where条件中不允许出现 字段名 not in (''),这在PostgreSQL和MS SQL Server里完全没问题,但如果你用在Oracle中,则查不出数据,也不报错。。

另外判断字段值是否为空时也不能直接用 字段名='',也是查不出数据,判断为空时可用以下方式:

字符串名 is null or 字符串名 = ' '

判断非空时用以下方式:

字段名 is not null and 字段名 <> ' '

另外Null不支持加、减、乘、除、大小比较、相等比较 ,所以对空值进行操作时需要把空值改为有意义的值,可以使用NVL,如 nvl(字段名, 0) ,但NVL只能处理单位参数,如果要处理多个参数,可以使用COALESCE,比如要C1~C6各列不为空的值,如下:

SELECT nvl(nvl(nvl(nvl(nvl(c1,c2),c3),c4),c5),c6) AS c FROMtable1table1;

SELECT COALESCE(C1,C2,C3,C4,C5,C6) AS c FROMtable1;

另外不同的函数对空值的处理方式也不一样,有些会返回空值:

select greatest(1,null) from dual;

--结果:
GREATEST(1,NULL)
------------------
NULL

有些会返回期望的结果:

select replace('abcde', 'a', null) as str from dual;

--结果:
STR
-----
bcde

而在DECOE中还可以比较空值:

select deptno,ename,comm,decode(comm, null, 0) from scott.emp where deptno=20;

--结果:
DEPTNO ENAME   COMM  DECODE(COMM,NULL,0)
------ -----   ----- -------------------
  20   SMITH           0
  20   JONES           0

因此遇到Null时最好测试一下结果会受什么影响,不要仅凭相像。

3. 使用rownum来限制返回行数

select * from emp where rownum<=2

rownum是伪列,会依次对返回的第一条数据做一个标识,不能直接用rownum=2来取数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值