我有创造的飞行记录的表如下SQL ORDER BY DECODE将数字排序为字符串?
CREATE TABLE FLIGHT_DETAILS
(
FLIGHT_ID NUMBER(10) PRIMARY KEY,
FLIGHT_NO VARCHAR2(10),
DEPARTURE_DTE DATE,
TOTAL_PASSENGERS NUMBER(3)
);
然后,我有我的应用程序调用来检索根据所选列排序的记录(按降序排列)的功能。
CREATE OR REPLACE FUNCTION func_get_flight_details (
p_order_col IN CHAR)
RETURN sys_refcursor
AS
v_ref_cursor sys_refcursor;
v_sql_str VARCHAR2(2048);
BEGIN
OPEN v_ref_cursor FOR
SELECT FLIGHT_NO, DEPARTURE_DTE, TOTAL_PASSENGERS
FROM FLIGHT_DETAILS
ORDER BY DECODE(p_order_col,
'FLIGHT_NO', FLIGHT_NO,
'DEPARTURE_DTE', TO_DATE(DEPARTURE_DTE, 'YYYY/MM/DD'),
'TOTAL_PASSENGERS', TOTAL_PASSENGERS) DESC;
RETURN v_ref_cursor;
END;
双方FLIGHT_NO
和DEPARTURE_DTE
排序工作正常。我的问题是当我试图通过TOTAL_PASSENGERS
进行排序,这让我这个
FLIGHT_NO DEPARTURE_DTE TOTAL_PASSENGERS
-------------------------------------------------
OR3237 01/03/16 9
RM7202 15/01/16 50
CQ8429 05/10/16 250
DA5720 21/07/16 100
出于某种原因,DECODE被排序NUMBER
列的字符串。为了测试,我想这
SELECT FLIGHT_NO, DEPARTURE_DTE, TOTAL_PASSENGERS
FROM FLIGHT_DETAILS
ORDER BY TOTAL_PASSENGERS DESC;
这给了我
FLIGHT_NO DEPARTURE_DTE TOTAL_PASSENGERS
-------------------------------------------------
CQ8429 05/10/16 250
DA5720 21/07/16 100
RM7202 15/01/16 50
OR3237 01/03/16 9
证明,这个问题是不是与列本身。
然后我尝试了一些解决方案,我对SO
ORDER BY DECODE(p_order_col,
'FLIGHT_NO', FLIGHT_NO,
'DEPARTURE_DTE', TO_DATE(DEPARTURE_DTE, 'YYYY/MM/DD'),
'TOTAL_PASSENGERS', TO_NUMBER(TOTAL_PASSENGERS)) DESC;
ORDER BY DECODE(p_order_col,
'FLIGHT_NO', FLIGHT_NO,
'DEPARTURE_DTE', TO_DATE(DEPARTURE_DTE, 'YYYY/MM/DD'),
'TOTAL_PASSENGERS', LPAD(TOTAL_PASSENGERS, 10)) DESC;
ORDER BY DECODE(p_order_col,
'FLIGHT_NO', FLIGHT_NO,
'DEPARTURE_DTE', TO_DATE(DEPARTURE_DTE, 'YYYY/MM/DD'),
'TOTAL_PASSENGERS', TOTAL_PASSENGERS*1) DESC;
其中没有工作(它仍然归类为一个字符串)发现。
那么为什么DECODE
拒绝将数字列作为数字进行排序呢?我如何才能正确排序?
看起来很棒!那会不会有性能问题?因为它看起来像你正在做3个单独的排序而不是1个(即使其中2个总是'null'。 – sml485
@ sml485。请参阅我在附加答案中的回复。 – BobC
@ sml485 ...不,没有额外的性能按三个键排序几乎与按一个键排序相同 –