Ich habe eine Tabelle von Flugdaten wie folgt erstelltSQL ORDER BY DECODE sortiert die Nummer als String?
CREATE TABLE FLIGHT_DETAILS
(
FLIGHT_ID NUMBER(10) PRIMARY KEY,
FLIGHT_NO VARCHAR2(10),
DEPARTURE_DTE DATE,
TOTAL_PASSENGERS NUMBER(3)
);
ich dann eine Funktion haben, die meine Anwendung ruft die Datensätze nach der ausgewählten Spalte (in absteigender Reihenfolge) sortiert abzurufen.
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;
sowohl Sortierung nach FLIGHT_NO
und DEPARTURE_DTE
korrekt funktioniert. Mein Problem kommt, wenn ich von TOTAL_PASSENGERS
zu sortieren versucht, die hat mich dieses
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
Aus irgendeinem Grund wird DECODE die NUMBER
Spalte als String sortieren. Um zu testen, habe ich versucht, diesen
SELECT FLIGHT_NO, DEPARTURE_DTE, TOTAL_PASSENGERS
FROM FLIGHT_DETAILS
ORDER BY TOTAL_PASSENGERS DESC;
, die mir gegeben hat
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
beweisen, dass das Problem nicht mit der Säule selbst.
Dann habe ich versucht, einige Lösungen, die ich auf 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;
von denen keine (es ist nach wie vor als String sortiert) arbeitete gefunden.
Warum also weigert sich DECODE
, eine Zahlenspalte als Zahl zu sortieren? Und wie bekomme ich es richtig zu sortieren?
Das sieht gut aus! Wird es keinen Performance-Hit geben? Da sieht es so aus, als würden Sie 3 separate Sortierungen anstelle von 1 durchführen (auch wenn 2 immer "null" sind. – sml485
@ sml485. Siehe meine Antwort in der zusätzlichen Antwort. – BobC
@ sml485.. Nein, es gibt keine zusätzliche Leistung Die Sortierung nach drei Tasten entspricht ungefähr der Sortierung nach einer Taste –