Oracle 处理null值
-
Nvl(expr1,expr2) -> expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致,如果不一致会存在隐式转换,不能转换时会报错;转换规则如下:
(1)如果参数1为字符型,则把参数2转换为参数1的类型,返回值为 VARCHAR2
(2)如果参数1为数值型,则判断两个参数的最高数值优先级(如双精实数比单 精实 数优先级高),然后转换成高优先级的数值,返回该类型的值. -
nvl2(expr1, expr2, expr3)-> expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换为expr2的类型,如果转换不了就会报错;
-
coalesce(expression,value1,value2……,valuen) ->
如果expression不为空值则返回expression;否则判断value1是否是空值,
如果value1不为空值则返回value1;否则判断value2是否是空值,
如果value2不为空值则返回value2;……以此类推,
如果所有的表达式都为空值,则返回NULL
Hive处理null值
- Nvl(value,default)->value不是null就直接返回,是null就返回默认值;
- Coalesce(a1,a2,a3…an) ->a1不是null就返回a1,否则判断a2,以此类推
要求所有表达式必须是相同类型,或者可以隐式转换为相同的类型; - NullIF(a,b)->如果a=b就返回null,否则就返回a;开始支持的版本是2.3.0;
需要额外注意的是:
- Hive里表在底层如何存储和标识null,是可以由参数控制的,比如
(1) alter table name SET SERDEPROPERTIES(‘serialization.null.format’ = ‘\N’)
底层保存的是‘\N‘,通过查询显示的是’NULL‘
(2) alter tablename SET SERDEPROPERTIES(‘serialization.null.format’ = ‘NULL’)
底层保存的是‘NULL‘,通过查询显示的是’NULL‘ - 空值‘‘
表示的是空字符串,通过is null这种过滤语法是无法查询到的,必须是a=‘‘或者length(a)=0; - 不同数据类型空值的处理
存储:int和string数据类型的字段,存储null是默认会存为’\N’;但是在存储“”时,int类型还是存储为’\N’,string类型则会存储为“”;
在查询时:int类型的字段可以用is null来进行判断,而对于string类型字段,isnull过滤的是存储为\N的数据,条件=“”过滤出来的是“”空字符串数据; - 使用小技巧
ALTER TABLE b SET SERDEPROPERTIES (‘serialization.null.format’=‘’);
让null和“”等价,null就会显示
Mysql处理null
- 函数:
Isnull(a)->如果a是null,返回1,其他返回0;
Ifnull(a,b)->如果a不是null,返回a,否则返回b;
Nullif(a,b)->如果a=b,返回null,否则返回a;
Coalesce(a,b,…)->返回参数里,第一个不为null的值;