如:
select a , b from table order by decode(a , null , 0 ,1);该SQL可以运行且无误,但问题是:
按SELECT的执行顺序,decode(a , null , 0 ,1)表达式完成计算,同时完成筛选获得a,b列,
最后执行order by ,按0或者1来排序。但筛选出来的并无0与1对应的一列,这样排序为什么会正确?

解决方案 »

  1.   

    --这样写,你就知道怎么回事了.
    select a,decode(a,null,0,1) v_dec,b from table order by decode(a,null,0,1); 其实你的结果是根据v_dec列进行排序的,所以显示正确.
    你并没有把v_dec这列select出来啊,所以当然没有0和1.
      

  2.   


    我晕,我的意思SQL就是要这样写出来才对。按你的意思来说的话,那SELECT A , B FROM TABLE ORDER BY C 也正确了?
      

  3.   

    按我的理解,SQL排序应该是
    SELECT A , B  FROM TABLE ORDER BY A|B才对;
    而SELECT A , B  FROM TABLE ORDER BY C 则是错误的
      

  4.   

    那你应该问:我想知道order by的算法,它的底层代码是如何写的?
    这个有点深了哦.
      

  5.   

    知道order by 后面跟的是一个表达式就好了
      

  6.   


    SELECT A , B  FROM TABLE ORDER BY C   is    right A:
     ID     NAME     C    
     -----  -------  ---- 
     1      AAA      3    
     2      BBB      2    
     3      CCC      1    
    select ID,NAME from A order by C asc
     ID     NAME    
     -----  ------- 
     3      CCC     
     2      BBB     
     1      AAA   
    select ID,NAME from A order by C desc
     ID     NAME    
     -----  ------- 
     1      AAA     
     2      BBB     
     3      CCC     
      

  7.   


    那说明你的理解错了,select后罗列出来的和order by后面罗列出来的没有任何关系...
    这么说吧,表T有a,b,c,d,4个字段,对于下面这句
    SELECT A , B  FROM T ORDER BY C 
    oracle把所有数据(每一列)都读出来,
    先按c排好序,再把你要的a,b列显示出来给你看.