我有創造的飛行記錄的表如下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 ...不,沒有額外的性能按三個鍵排序幾乎與按一個鍵排序相同 –