ORACLE处理排序空值

主要方法是通过使用CASE表达式来“标记”一个值是否为NULL。这里标记有两个值,一个表示NULL,一个表示非NULL。这样,只要在ORDER BY子句中增加标记列,便可以很容易的控制空值是排在前面还是排在后面,而不会被空值所干扰。

[c-sharp]  view plain copy
  1. SQL> select ename,sal,comm from emp;  
  2.   
  3. ENAME             SAL       COMM  
  4. ---------- ---------- ----------  
  5. SMITH             800  
  6. ALLEN            1600        300  
  7. WARD             1250        500  
  8. JONES            2975  
  9. MARTIN           1250       1400  
  10. BLAKE            2850  
  11. CLARK            2450  
  12. SCOTT            3000  
  13. KING             5000  
  14. TURNER           1500          0  
  15. ADAMS            1100  
  16.   
  17. ENAME             SAL       COMM  
  18. ---------- ---------- ----------  
  19. JAMES             950  
  20. FORD             3000  
  21. MILLER           1300  
  22.   
  23. 14 rows selected.  
  24.   
  25.    
  26.   
  27. //非空值按升序排序 空值排最后  
  28.   
  29. SQL> select ename,sal,comm from  
  30.   2  (  
  31.   3  select ename,sal,comm,  
  32.   4  case when comm is null then 0 else 1 end as is_null  
  33.   5  from emp  
  34.   6  ) x  
  35.   7  order by is_null desc,comm  
  36.   8  ;  
  37.   
  38. ENAME             SAL       COMM  
  39. ---------- ---------- ----------  
  40. TURNER           1500          0  
  41. ALLEN            1600        300  
  42. WARD             1250        500  
  43. MARTIN           1250       1400  
  44. SCOTT            3000  
  45. KING             5000  
  46. ADAMS            1100  
  47. JAMES             950  
  48. FORD             3000  
  49. MILLER           1300  
  50. BLAKE            2850  
  51.   
  52. ENAME             SAL       COMM  
  53. ---------- ---------- ----------  
  54. JONES            2975  
  55. SMITH             800  
  56. CLARK            2450  
  57.   
  58. 14 rows selected.  
  59.   
  60.    
  61.   
  62. //非空值按降序排序 空值排最后  
  63.   
  64. SQL> select ename,sal,comm from  
  65.   2  (  
  66.   3  select ename,sal,comm,  
  67.   4  case when comm is null then 0 else 1 end as is_null  
  68.   5  from emp  
  69.   6  ) x  
  70.   7  order by is_null desc,comm desc  
  71.   8  ;  
  72.   
  73. ENAME             SAL       COMM  
  74. ---------- ---------- ----------  
  75. MARTIN           1250       1400  
  76. WARD             1250        500  
  77. ALLEN            1600        300  
  78. TURNER           1500          0  
  79. SCOTT            3000  
  80. KING             5000  
  81. ADAMS            1100  
  82. JAMES             950  
  83. FORD             3000  
  84. MILLER           1300  
  85. BLAKE            2850  
  86.   
  87. ENAME             SAL       COMM  
  88. ---------- ---------- ----------  
  89. JONES            2975  
  90. SMITH             800  
  91. CLARK            2450  
  92.   
  93. 14 rows selected.  
  94.   
  95.    
  96.   
  97. //非空值按升序排序 空值排最前面  
  98.   
  99. SQL> select ename,sal,comm from  
  100.   2  (  
  101.   3  select ename,sal,comm,  
  102.   4  case when comm is null then 0 else 1 end as is_null  
  103.   5  from emp  
  104.   6  ) x  
  105.   7  order by is_null,comm  
  106.   8  ;  
  107.   
  108. ENAME             SAL       COMM  
  109. ---------- ---------- ----------  
  110. SMITH             800  
  111. CLARK            2450  
  112. FORD             3000  
  113. JAMES             950  
  114. ADAMS            1100  
  115. JONES            2975  
  116. BLAKE            2850  
  117. MILLER           1300  
  118. SCOTT            3000  
  119. KING             5000  
  120. TURNER           1500          0  
  121.   
  122. ENAME             SAL       COMM  
  123. ---------- ---------- ----------  
  124. ALLEN            1600        300  
  125. WARD             1250        500  
  126. MARTIN           1250       1400  
  127.   
  128. 14 rows selected.  
  129.   
  130.    
  131.   
  132. //非空值按降序排序 空值排最前面  
  133.   
  134. SQL> select ename,sal,comm from  
  135.   2  (  
  136.   3  select ename,sal,comm,  
  137.   4  case when comm is null then 0 else 1 end as is_null  
  138.   5  from emp  
  139.   6  ) x  
  140.   7  order by is_null,comm desc  
  141.   8  ;  
  142.   
  143. ENAME             SAL       COMM  
  144. ---------- ---------- ----------  
  145. SMITH             800  
  146. CLARK            2450  
  147. FORD             3000  
  148. JAMES             950  
  149. ADAMS            1100  
  150. JONES            2975  
  151. BLAKE            2850  
  152. MILLER           1300  
  153. SCOTT            3000  
  154. KING             5000  
  155. MARTIN           1250       1400  
  156.   
  157. ENAME             SAL       COMM  
  158. ---------- ---------- ----------  
  159. WARD             1250        500  
  160. ALLEN            1600        300  
  161. TURNER           1500          0  
  162.   
  163. 14 rows selected.  
  164.   
  165.    
  166.   
  167. 其实在ORACLE中,可以使用NULLS FIRST和NULLS LAST来实现相同功能  
  168.   
  169. 下面四条语句分别和上面四种写法相对应  
  170.   
  171. select ename,sal,comm  
  172.   
  173. from emp  
  174.   
  175. order by comm nulls last  
  176.   
  177.    
  178.   
  179. select ename,sal,comm  
  180.   
  181. from emp  
  182.   
  183. order by comm desc nulls last  
  184.   
  185.    
  186.   
  187. select ename,sal,comm  
  188.   
  189. from emp  
  190.   
  191. order by comm nulls first  
  192.   
  193.    
  194.   
  195. select ename,sal,comm  
  196.   
  197. from emp  
  198.   
  199. order by comm desc nulls first

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值