`
enzesheng
  • 浏览: 2074 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

ORACLE-NULL

 
阅读更多
一、
1、NULL是无类型的,或可以是任意类型的值
2、可以通过SET NULL TEXT设置SQL*PLUS中NULL显示为指定的值。
   SET NULL UNKNOWN;
3、任何和NULL的比较操作(>,<,=等)都返回空行,算术操作(+,-,*,/)的结果还是NULL
4、||,CONCAT会忽略NULL

二、NULL与函数
1、NVL(EXPR1,EXPR2)
2、NVL2(EXPR1,EXPR2,EXPR3)
3、NULLIF(EXPR1,EXPR2)  判断expr1和expr2是否相等,若相等返回NULL,否则返回expr1
注:1)'ab'和'ab   '是相等的 2)expr1不可以是字面量NULL,但可以是来自表中的NULL,因为是有类型的
4、COALESCE(expr1,expr2,...,exprn)
   从左到右返回返回第一个非NULL值,若均为NULL,则返回NULL
   注:要求参数为同一类型簇
5、CASE 和 DECODE
1)
SELECT CASE WHEN ID<5
       THEN ' <5'
       WHEN ID<8
       THEN ' <8'
       ELSE ' >=8'
       END
  FROM T      
2)DECODE函数常见用途:按字段内容分组,按字段内容排序,固定行转列
----按字段内容分组
SELECT DECODE(AAC008,'11','就业','12','就业','13','就业','14','就业','15','就业','19','就业',
              '30','失业','31','失业','32','失业','33','失业','34','失业','39','失业',
              '40','离退休','41','离退休','42','离退休',
              '01','劳动力资源','20','劳动力资源',
              '其他'),COUNT(1) rs
  FROM AC01
GROUP BY  DECODE(AAC008,'11','就业','12','就业','13','就业','14','就业','15','就业','19','就业',
              '30','失业','31','失业','32','失业','33','失业','34','失业','39','失业',
              '40','离退休','41','离退休','42','离退休',
              '01','劳动力资源','20','劳动力资源',
              '其他');  
----按字段内容排序
中文转数字后排序 DECODE(column_name,'张三','1','李四','2')
----固定行转列
WITH temp AS (
SELECT DECODE(aac008,'11','就业','12','就业','13','就业','14','就业','15','就业','19','就业',
              '30','失业','31','失业','32','失业','33','失业','34','失业','39','失业',
              '40','离退休','41','离退休','42','离退休',
              '01','劳动力资源','20','劳动力资源',
              '其他') ryzt,COUNT(1) rs
  FROM AC01
GROUP BY  DECODE(aac008,'11','就业','12','就业','13','就业','14','就业','15','就业','19','就业',
              '30','失业','31','失业','32','失业','33','失业','34','失业','39','失业',
              '40','离退休','41','离退休','42','离退休',
              '01','劳动力资源','20','劳动力资源',
              '其他')  )
SELECT MAX(DECODE(ryzt,'就业',rs)) 就业,
       MAX(DECODE(ryzt,'失业',rs)) 失业,
       MAX(DECODE(ryzt,'离退休',rs)) 离退休,
       MAX(DECODE(ryzt,'劳动力资源',rs)) 劳动力资源,
       MAX(DECODE(ryzt,'其他',rs)) 其他
  FROM temp   ;          

三、NULL与索引
1、oracle的B*Tree索引不存储全为NULL的列。如果本来某个列就是NOT NULL的,但是在设计的时候没有加这个约束,可能会导致最终的执行计划较差。
2、实例:如果某列有一些NULL值,但是占得比例很小,希望IS NULL条件能够走索引,但是又不想建立像上面一样的复合索引或增加NOT NULL条件,如何做?
CREATE INDEX idx_t ON t(a,0);
3、实例
比如一个表中某列只有处理和未处理两种状态,对于未处理的占很少,而已处理的往往很多,我们经常查询未处理的,已处理的查询很少,很多历史记录,都希望它走全表扫描。为了节省维护索引的开销,降低索引存储空间,可以对未处理的记录索引,已处理的不存储到索引中,那么可以使用基于函数的索引。
--不为0的自动转为NULL,就进入不了索引了
CREATE INDEX idx_t ON t(DECODE(A,0,0,NULL));

四、NULL和SQL
1、建表的时候NOT NULL和DEFAULT放一起,必须NOT NULL在DEFAULT后面
2、a表中 【(1,aa),(2,bb)】,b表中【(1,aa),(null,bb)】
select * from a where (id,name) not in (select id,name from b);--查询结果为空
因为NOT IN实际上的执行为
select * from a where (id<>1 or name <> aa) and (id <> null or name <> 'bb');
3、NOT IN和NOT EXISTS不是等价的
4、集合处理UNION,INTERSECT,MINUS,分组语句认为NULL是相等的
5、GROUP BY ID NULLS FIRST
   GROUP BY ID NULLS LAST

五、NULL和PL/SQL
1、NULL是PL/SQL Boolean类型的第三个值
2、EXECUTE IMMEDIATE v_sql USING vbirth;--vsql vbirth变量
3、start_time := DBMS_UTILITY.get_time;--start_time变量
4、PL/SQL中的NULL语句
作用:提高程序可读性、和GOTO配合使用
1)
IF condition THEN
  do something;
ELSE
  NULL;
END IF;
2)
...
BEGIN
...
IF condition THEN
  GOTO endprc;
END IF;
...
<<endprc>>
NULL;
END;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics