字段值为null的处理
当字段的值为null我们在查询的时候有些情况可能会报错,这是就需要将null值变成一个指定的数据。有如下的数据,我们需要更具操作日期进行排序,需要先将operatetime转换成日期类型然后进行排序操作,但是由于这个字段的某一些数据为null,转换的时候就会出错。
id | name | operatedate | operatetime |
---|---|---|---|
1 | ali | null | null |
2 | oops | 2017-11-12 | 12:01:12 |
3 | yahoo | null | null |
4 | qwerty | 2018-01-01 | 13:01:11 |
对于上面的数据在oracle中使用如下的sql按operatetime字段进行排序这回报错, |
SELECT id,name,TO_DATE(CONCAT(operatedate,CONCAT(' ',operatetime)),'yyyy-mm-dd hh24:mi:ss') optime FROM OPERATE ORDER BY optime DESC;
修改之即可正确运行
SELECT id,name,TO_DATE(CONCAT(nvl(operatedate,'1900-01-01'),CONCAT(' ',nvl(operatetime,'00:00:00'))),'yyyy-mm-dd hh24:mi:ss') optime FROM OPERATE ORDER BY optime DESC;
oracle
NVL(expr1,expr2)
如果expr1为null,返回expr2,如果expr1和expr2的类型不同就会进行隐式的类型转换,将expr2如果不能够隐式地转换成expr的类型会报错;如果expr1不为null,返回expr1。
NVL2 ( expr1 , expr2 , expr3 )
当expr1为null返回expr2,否则返回expr3,同样也会发生隐式的数据类型转换。
sql server
ISNULL ( check_expression , replacement_value )
当check_expression为null的时候返回replacement_value,其中replacement_value的值必须能够隐式的转换成check_expression的类型。
mysql
IFNULL(expr1,expr2)
当expr1不为null时返回expr2,否则返回expr1。
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,'yes');
-> 'yes'
case when then else end用法实现
select id,name, (case when operatedate is null then '1900-01-01' else operatedate end) op from OPERATE;
如果operatedate字段为null则operatedate的值为1900-01-01,否则为operatedate的原始值。
参考
1.Oracle® DatabaseSQL Language Reference11g Release 2 (11.2)
2.https://docs.microsoft.com/en-us/sql/t-sql/functions/isnull-transact-sql