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的内部函数之类的?
(
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的内部函数之类的?
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;
--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