У меня есть таблица полетных записей, созданных следующим образом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
По какой-то причине, декодирование сортировки 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 ... Нет, нет дополнительной производительности сортировка по трем клавишам примерно такая же, как и сортировка по одному ключу. –