2010-07-02 5 views
0

Я хочу выполнить специальный запрос в таблице в моей базе данных оракула.Oracle 10g-Express Query

Я хочу, чтобы результат сортировался в соответствии с перечислением, которое у меня есть.

перечисление идет следующим образом:

private enum days 
{ 
    Saturday = 1, 
    Sunday, 
    Monday, 
    Tuesday, 
    Wednesday, 
    Thursday, 
} 

Я хочу, чтобы результат будет отсортирован в соответствии с этим перечислением.

ответ

1
order by 
    case to_char(datecol, 'D') 
    when 1 then 2 
    when 2 then 3 
    ... 
    when 7 then 1 
    end 
+0

На самом деле я не понимаю ваш код ... вы можете объяснить, как выполнить оракул SQL – sikas

+0

Возвращаемое значение to_char (..., 'D') может зависеть от настроек NLS (некоторые начинают воскресенье, некоторые в понедельник). –

2

Итак, ваш ENUM - это интерфейс, который база данных не может видеть. Все, что вы можете сделать, это дублировать свою логику в запросе. В Oracle мы можем использовать такие функции, как CASE(), чтобы преобразовать значение столбца в другое значение для сортировки.

SQL> select d2 
    2   , to_char(d2, 'DY') 
    3 from t34 
    4 ORDER BY CASE to_char(d2, 'DY') 
    5    WHEN 'SAT' THEN 1 
    6    WHEN 'SUN' THEN 2 
    7    WHEN 'MON' THEN 3 
    8    WHEN 'TUE' THEN 4 
    9    WHEN 'WED' THEN 5 
10    WHEN 'THU' THEN 6 
11    WHEN 'FRI' THEN 7 
12  ELSE 100 END 
13/

D2  TO_ 
--------- --- 
25-JUL-10 SUN 
24-AUG-10 TUE 
13-JUL-10 TUE 
26-MAY-10 WED 
15-APR-10 THU 
25-JUN-10 FRI 

6 rows selected. 

SQL> 

Точные значения даты сокращений будет зависеть от значения параметра NLS_DATE_LANGUAGE. Find out more.

Форматирование даты в Oracle также позволяет нам конвертировать DATE в число в течение дня недели. Это культурная вещь: некоторые общества имеют понедельник как первый день недели, другие воскресенье или субботу. Поэтому TO_CHAR (some_date, 'D') вернет 1 для даты, которая является понедельником в Европе, но 2 в США. Это контролируется настройками NLS_TERRITORY. Find out more.

Если ваша территория установлена ​​таким образом, что TO_CHAR (date_col, «D») возвращает 1 для даты, которая является субботой заказ по п гораздо проще:

SQL> select * from nls_session_parameters 
    2 where parameter = 'NLS_TERRITORY' 
    3/

PARAMETER      VALUE 
------------------------------ ----------------- 
NLS_TERRITORY     UNITED KINGDOM 

SQL> select d2 
    2   , to_char(d2, 'DY') 
    3   , to_char(d2, 'D') 
    4 from t34 
    5 ORDER BY to_char(d2, 'D') 
    6/

D2  TO_ T 
--------- --- - 
13-JUL-10 TUE 2 
24-AUG-10 TUE 2 
26-MAY-10 WED 3 
15-APR-10 THU 4 
25-JUN-10 FRI 5 
25-JUL-10 SUN 7 

6 rows selected. 
SQL> 

Если изменить NLS_TERRITORY результат установленный порядок изменяется соответственно:

SQL> alter session set nls_territory='MOROCCO' 
    2/

Session altered. 

SQL> select d2 
    2   , to_char(d2, 'DY') 
    3   , to_char(d2, 'D') 
    4 from t34 
    5 ORDER BY to_char(d2, 'D') 
    6/

D2  TO_ T 
-------- --- - 
25-07-10 SUN 2 
24-08-10 TUE 4 
13-07-10 TUE 4 
26-05-10 WED 5 
15-04-10 THU 6 
25-06-10 FRI 7 

6 rows selected. 

SQL> 
+0

Последнее решение прост - и, следовательно, лучше - и вы можете легко адаптировать его к работе в течение нескольких недель, которые начинаются в другие дни (воскресенье, понедельник и т. Д.), Делая что-то вроде MOD (TO_CHAR (data_col, 'D') + offset, 7). – JulesLt

+0

ну, первый код дал мне эту ошибку ORA-00900: неверный оператор SQL ... и второй не сделал сортировку – sikas

+0

UPDATE: первый код работал со мной, но не сортировал !! – sikas

1

Я upvoted АРС решение, это лучший/правильный способ сделать это.

Однако я хотел добавить ответ, который относится к общему случаю заказа произвольным набором данных.

(В этом конкретном случае заказ не является произвольным - это то, что мы можем написать как простая функция SQL - так должно).

Главное, что перечисление представляет собой SET. Таблица также представляет собой набор, а также вид - так что просто преобразуйте ваш enum в таблицу или представление, а затем в свои SQL-запросы вы можете присоединиться к этой команде/к этой таблице.

Это особенно полезно, если вам нужно повторно использовать его во многих запросах.

Для небольшого фиксированного набора, подобного этому, я бы просто запрограммировал его в виде - для больших наборов индексированная таблица была бы лучше.

Будучи честным - если бы он был настоящим разовым - если бы я знал, что заказ будет использоваться только в одном запросе - я бы использовал подход CASE в главном ответе.

+0

спасибо за ваш ответ ... могу ли я узнать, как выполнять операции объединения на Oracle 10g XE? Я пробовал искать в Интернете, но я полностью провалился! – sikas

+0

@sikas: Oracle 10g XE в значительной степени поддерживает стандартный SQL. Соединение выполняется путем перечисления обеих таблиц в предложении FROM запроса, а затем добавления критериев присоединения. –