order by排序之null值处理方法在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题。在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则排在最前。所以,为何分析数据的直观性方便性,我们需要对null的记录值进行相应处理。

这是四种oracle排序中NULL值处理的方法:

1、使用nvl函数语法:Nvl(expr1, expr2)

若EXPR1是NULL,則返回EXPR2,否則返回EXPR1.

SELECT NAME,NVL(TO_CHAR(COMM),'NOT APPLICATION') FROM TABLE1;

nvl函数可以在输入参数为空时转换为一特定值,如

nvl(person_name,“未知”)表示若person_name字段值为空时返回“未知”,如不为空则返回person_name的字段值。

通过这个函数可以定制null的排序位置。

2、使用decode函数

decode函数比nvl函数更强大,同样它也可以将输入参数为空时转换为一特定值,如

decode(person_name,null,“未知”, person_name)表示当person_name为空时返回“未知”,如不为空则返回person_name的字段值。

通过此函数也可以定制null的排序位置。

3、使用nulls first 或者nulls last 语法,最简单常用的方法。

Nulls first和nulls last是Oracle Order by支持的语法

(1)若Order by 中指定了表达式Nulls first则表示null值的记录将排在最前(不管是asc 还是 desc)

(2)若Order by 中指定了表达式Nulls last则表示null值的记录将排在最后 (不管是asc 还是 desc)

使用方法举例如下:

将nulls始终放在最前:

select * from tbl order by field nulls first

将nulls始终放在最后:

select * from tbl order by field desc nulls last

4、使用case 语法

Case语法是Oracle 9i后开始支持的,是一个比较灵活的语法,同样在排序中也可以应用

如:

select *

from students

order by (case person_name

when null then

'未知'

else

person_name

end)

表示在person_name字段值为空时返回'未知',如果不为空则返回person_name

通过case语法同样可以定制null的排序位置。

项目实例:

!defined('PATH_ADMIN') && exit('Forbidden');

class mod_gcdownload

{

public static function get_gcdownload_datalist($start = 0,$rowsperpage = PAGE_ROWS, $datestart = '',$dateend = '',$ver = '',$coopid = '',$subcoopid = '',$sortfield = '', $sorttype = '', $pid = 123456789, $plat = 'abcdefg'){

$sql = '';

$condition = empty($datestart) ? " WHERE 1=1 " : " WHERE t.statistics_date >= '$datestart' AND t.statistics_date <= '$dateend'";

if($ver)

{

$condition .= " AND t.edition='$ver'";

}

if($coopid)

{

$condition .= " AND t.suco_coopid=$coopid";

}

if($subcoopid)

{

$condition .= " AND t.suco_subcoopid=$subcoopid";

}

if($sortfield && $sorttype){

$condition .= " ORDER BY t.{$sortfield} {$sorttype} NULLS LAST";

}elseif($sortfield){

$condition .= " ORDER BY t.{$sortfield} desc NULLS LAST";

}else{

$condition .= " ORDER BY t.statistics_date desc NULLS LAST";

}

$finish = $start + $rowsperpage;

$joinsqlcollection = "(SELECT tc.coop_name, tsc.suco_name, tsc.suco_coopid,tsc.suco_subcoopid, s.edition, s.new_user, d.one_user, d.three_user, d.seven_user, s.statistics_date FROM (((pdt_stat_newuser_{$pid}_{$plat} s LEFT JOIN pdt_days_dl_remain_{$pid}_{$plat} d ON s.statistics_date=d.new_date AND s.subcoopid=d.subcoopid AND s.edition=d.edition )LEFT JOIN tbl_subcooperator@JTUSER1.NET@JTINFO tsc ON s.subcoopid=tsc.suco_subcoopid) LEFT JOIN tbl_cooperator@JTUSER1.NET@JTINFO tc ON tsc.suco_coopid=tc.coop_id))";

$sql = "SELECT * FROM (SELECT tb_A.*, ROWNUM AS rn FROM (SELECT t.* FROM $joinsqlcollection t {$condition} ) tb_A WHERE ROWNUM <= {$finish} ) tb_B WHERE tb_B.rn>{$start} ";

$countsql = "SELECT COUNT(*) AS totalrows, SUM(t.new_user) AS totalnewusr,SUM(t.one_user) AS totaloneusr,SUM(t.three_user) AS totalthreeusr,SUM(t.seven_user) AS totalsevenusr FROM $joinsqlcollection t {$condition} ";

$db = oralceinit(1);

$stidquery = $db->query($sql,false);

$output = array();

while($row = $db->FetchArray($stidquery, $skip = 0, $maxrows = -1))

{

$output['data'][] = array_change_key_case($row,CASE_LOWER);

}

$count_stidquery = $db->query($countsql,false);

$row = $db->FetchArray($count_stidquery, $skip = 0, $maxrows = -1);

$output['total']= array_change_key_case($row,CASE_LOWER);

//echo "
".($sql)."
";

return $output;

}

}

Null与空字符串' '的区别含义解释:

问:什么是NULL?

答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零。

ORACLE允许任何一种数据类型的字段为空,除了以下两种情况:

1、主键字段(primary key),

2、定义时已经加了NOT NULL限制条件的字段

说明:

1、等价于没有任何值、是未知数。

2、NULL与0、空字符串、空格都不同。

3、对空值做加、减、乘、除等运算操作,结果仍为空。

4、NULL的处理使用NVL函数。

5、比较时使用关键字用“is null”和“is not null”。

6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查。

7、排序时比其他数据都大(索引默认是降序排列,小→大),所以NULL值总是排在最后。

使用方法:

SQL> select 1 from dual where null=null;

没有查到记录

SQL> select 1 from dual where null='';

没有查到记录

SQL> select 1 from dual where ''='';

没有查到记录

SQL> select 1 from dual where null is null;

1

---------

1

SQL> select 1 from dual where nvl(null,0)=nvl(null,0);

1

---------

1

对空值做加、减、乘、除等运算操作,结果仍为空。

SQL> select 1+null from dual;

SQL> select 1-null from dual;

SQL> select 1*null from dual;

SQL> select 1/null from dual;

查询到一个记录.

注:这个记录就是SQL语句中的那个null

设置某些列为空值

update table1 set 列1=NULL where 列1 is not null;

现有一个商品销售表sale,表结构为:

month    char(6)      --月份

sell    number(10,2)   --月销售金额

create table sale (month char(6),sell number);

insert into sale values('200001',1000);

insert into sale values('200002',1100);

insert into sale values('200003',1200);

insert into sale values('200004',1300);

insert into sale values('200005',1400);

insert into sale values('200006',1500);

insert into sale values('200007',1600);

insert into sale values('200101',1100);

insert into sale values('200202',1200);

insert into sale values('200301',1300);

insert into sale values('200008',1000);

insert into sale(month) values('200009');(注意:这条记录的sell值为空)

commit;

共输入12条记录

SQL> select * from sale where sell like '%';

MONTH SELL

------ ---------

200001 1000

200002 1100

200003 1200

200004 1300

200005 1400

200006 1500

200007 1600

200101 1100

200202 1200

200301 1300

200008 1000

查询到11记录.

结果说明:

查询结果说明此SQL语句查询不出列值为NULL的字段

此时需对字段为NULL的情况另外处理。

SQL> select * from sale where sell like '%' or sell is null;

SQL> select * from sale where nvl(sell,0) like '%';

MONTH SELL

------ ---------

200001 1000

200002 1100

200003 1200

200004 1300

200005 1400

200006 1500

200007 1600

200101 1100

200202 1200

200301 1300

200008 1000

200009

查询到12记录.

Oracle的空值就是这么的用法,我们最好熟悉它的约定,以防查出的结果不正确。

但对于char 和varchar2类型的数据库字段中的null和空字符串是否有区别呢?

作一个测试:

create table test (a char(5),b char(5));

SQL> insert into test(a,b) values('1','1');

SQL> insert into test(a,b) values('2','2');

SQL> insert into test(a,b) values('3','');--按照上面的解释,b字段有值的

SQL> insert into test(a) values('4');

SQL> select * from test;

A B

---------- ----------

1 1

2 2

3

4

SQL> select * from test where b='';

----按照上面的解释,应该有一条记录,但实际上没有记录

未选定行

SQL> select * from test where b is null;

----按照上面的解释,应该有一跳记录,但实际上有两条记录。

A B

---------- ----------

3

4

SQL>update table test set b='' where a='2';

SQL> select * from test where b='';

未选定行

SQL> select * from test where b is null;

A B

---------- ----------

2

3

4

测试结果说明,对char和varchar2字段来说,''就是null;但对于where 条件后的'' 不是null。

对于缺省值,也是一样的!

oracle和mysql空字符串_Oracle数据库中对null值的排序及mull与空字符串的区别相关推荐

  1. 下列有关mysql数据库中的null值_MySQL数据库中与 NULL值有关的问题

    对于SQL的新手,NULL值的概念常常会造成混淆,他们常认为NULL是与空字符串"相同的事.情况并非如此.例如,下述语句是完全不同的: mysql> INSERT INTO my_ta ...

  2. oracle和mysql数据类型转换_oracle数据库和MySQL数据库中表格转换时的数据类型

    下面是oracle数据库中的语句请问前辈将下面语句转换成MySQL里的语句是什么样的坐等CREATETABLE"LXA"."USERS"("U_ID& ...

  3. mysql支持非关系_说下oracle、mysql、非关系型数据库中的索引结构?

    谢邀~~树懒君悉心整理了一篇索引结构方面的内容,跟各位知友分享分享~ Oracle 索引的数据结构:B-TreeOracle 数据库使用 B-trees 存储索引,来加速数据访问.若没有索引,你必须顺 ...

  4. oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程

    在设计数据库表的时候发现Oracle没有自增主键的设置,Google了解到Oracle本身并不支持自增主键,需要通过序列(Sequence)和触发器(Trigger)实现. 创建表Student Cr ...

  5. oracle全局索引 前缀索引_Oracle数据库中的索引详解

    一. ROWID的概念 存储 了row在数据文件中的具体位置:64位编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储 方式 SELECT ROWID, last_nam ...

  6. oracle 排序_Oracle数据库中SQL之过滤和排序数据

    1 过滤 使用WHERE子句,将不满足条件的行过滤掉.WHERE子句紧随FROM子句 SELECT *|{[DISTINCT]column|expression[alias]} FROM table ...

  7. mysql numeric 空值_mysql数据库不能添加NULL值,该怎么解决 - numeric

    ...持许多种不同的数值型数据.你可以存储整数 INT .小数 NUMERIC.和钱数 MONEY.INT VS SMALLINT VS TINYINT 他们的区别只是字符长度: INT型数据的表数范 ...

  8. oracle sql为null值,在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办

    在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacem ...

  9. sqlinesdata教程_oracle数据库中的表如何能够导入到mysql中?

    Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等 Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全量.增量 ...

最新文章

  1. 在Ubuntu 14.04 64bit上使用dig
  2. ZABBIX 企业级分布式监控系统 1 监控系统简介
  3. python类方法继承_对python中类的继承与方法重写介绍
  4. php import用法,JavaScript中import怎么使用?
  5. TypeScript 的类型推导 Type Inference
  6. 《WinForm开发系列之高级篇》Item2 TCP异步传输
  7. struts+swfupload实现批量图片上传(上):swfupload
  8. 在VS2005中使用添加变量向导十分的
  9. 数据结构 - 栈(数组模拟栈操作)
  10. OpenInfra Days China 2020大会议程已上线!
  11. MySQL不走联合索引_mysql group by 多列优化思路?为什么不走联合索引?
  12. 实战篇:教你建设企业销售分析系统
  13. Aspectj快速上手代码示例之Before,After,Around
  14. uiuc工程学院计算机,UIUC的ECE「伊利诺伊大学香槟分校电气与计算机工程系」
  15. Tuxedo中间件介绍
  16. 银行软件测试测试用例,银行测试用例设计经验总结,应该怎样去设计测试用例?...
  17. 我不小心删除了dwm.exe。就是桌面窗口管理器的那个程序哈哈
  18. Lora中信息码片,编码率解释
  19. OLT基本操作及ONU的认证
  20. Java好学吗?现在待遇如何?

热门文章

  1. R语言实现多维尺度分析(Multidimensional Scaling,MDS)
  2. .iso与.mdx(mds)格式的区别
  3. [渝粤教育] 西南科技大学 劳动法与社会保障法 在线考试复习资料2021版
  4. android 动画方式,Android Activity进出动画三种方法
  5. 一个不错的分享源码的网站
  6. 将从键盘上输入的小写字母转换成大写字母输入
  7. 卡耐基《人性的优点》摘录
  8. 赵丽颖、冯绍峰的官宣炸了微博的高并发系统!
  9. python双色球选号_python实现双色球随机选号
  10. RSA大数运算实现(1024位n)(5)蒙哥马利模幂