oracle 中SELECT    b.EMPLOYEE_CODE  as me
FROM  VB_TEST_EMPLOYEE  b
order  by  me 
这样是可行的,为什么,下面不行啊,怎么解决
SELECT    
        CASE WHEN b.EMPLOYEE_CODE ='12'  THEN
                b.EMPLOYEE_NAME 
        ELSE
                b.EMPLOYEE_NAME
        END  AS NAME 
FROM  VB_TEST_EMPLOYEE  b
where    NAME LIKE 'd%'

解决方案 »

  1.   


    SELECT    b.EMPLOYEE_CODE  as me
    FROM  VB_TEST_EMPLOYEE  b
    order  by  me;
    也可以改成
    SELECT    b.EMPLOYEE_CODE  as me
    FROM  VB_TEST_EMPLOYEE  b
    order  by  1;为什么哪?原因是oracle从数据文件中取出数据后,排序操作是不需必须使用原始列名的。而where条件中的列名必须是from的对象中的列名,不能是alias的名子,因为取数时是要靠实际列名的数据来筛选的。如果想用你给的alias列名,可以再嵌套一次:
    select * from(SELECT CASE
             WHEN B.EMPLOYEE_CODE = '12' THEN
              B.EMPLOYEE_NAME
             ELSE
              B.EMPLOYEE_NAME
           END AS NAME
      FROM VB_TEST_EMPLOYEE B)
     WHERE NAME LIKE 'd%';
      

  2.   


    select * from tt
    t01     t02
    a 1
    a 2
    b 1
    b 3------------------------------------------------------------
    select case when t01='a' then t02 else t02 end as new from tt
    where    t01 LIKE 'a%' order by 1result:
    new
    1
    2
      

  3.   

    第一个sql是可以的.因为order by 的时候是可以用列别名的
    第二个sql是不可以的.因为where后面需要真实列名.不可以用
    别名.
      

  4.   

    order by 是对查询结果进行排序,你的第二个查询属于对表的name字段进行查询
      

  5.   

    别名只能用在 order by 部分,where 部分不能使用列别名。从 sql 语句处理的逻辑顺序来讲,别名的生成是在做 where 过滤之后,也就是说,系统处理 where 子句的时候,别名还不存在。