Oracle9i 请求实现排序。已知建表:CREATE TABLE ttt
(
a_TYPE Number(1) NOT NULL,
b_type NUMBER(2) NOT NULL,
c_type VARCHAR2(2) 
);插入数据:INSERT INTO ttt VALUES(1,3,'02');
INSERT INTO ttt VALUES(2,2,'02');
INSERT INTO ttt VALUES(1,1,'01');
INSERT INTO ttt VALUES(3,3,'02');
INSERT INTO ttt VALUES(1,2,'01');
INSERT INTO ttt VALUES(3,1,'01');
INSERT INTO ttt VALUES(2,1,'02');
INSERT INTO ttt VALUES(3,2,'03');
COMMIT;要求:
--查询结果按照a_TYPE的顺序依次展示。
--对于a_TYPE=1,按照 b_type 顺序排列;
--对于a_TYPE=2,不区分顺序;
--对于a_TYPE=3,按照c_type顺序依次排列。我写了个SQL可以实现这个功能,如下:SELECT * FROM (SELECT * FROM ttt t WHERE t.a_TYPE=1 ORDER BY t.b_type)
UNION ALL 
SELECT * FROM (SELECT * FROM ttt t WHERE t.a_TYPE=2 )
UNION ALL 
SELECT * FROM (SELECT * FROM ttt t WHERE t.a_TYPE=3 ORDER BY t.c_type) ;结果应如下显示:
a_type  b_type  c_type
------  ------  ------
1 1 01
1 2 01
1 3 02
2 2 02
2 1 02
3 1 01
3 3 02
3 2 03
问:有没有更好的方法可以实现这个功能,比如调用Oracle的内部函数之类的?

解决方案 »

  1.   

    --法1,使用decode
     SELECT *
      FROM ttt t
     ORDER BY t.a_type, decode(t.a_type, 1, t.b_type, decode(t.a_type, 3,t.c_type));
    --法2,使用case
      SELECT   *
        FROM   ttt t
    ORDER BY   t.a_type, CASE t.a_type
                            WHEN 1 THEN t.b_type
                            WHEN 3 THEN TO_NUMBER (t.c_type)
                            ELSE NULL
                         END;
      

  2.   


    --decode 函数 跟case 语句
    SELECT * FROM ttt 
    order by case when a_TYPE=1 then b_type when a_TYPE=3 then c_type else null end