我想对我的oracle数据库中的表执行特殊查询。
我希望根据我拥有的枚举对结果进行排序。
枚举如下:
private enum days
{
Saturday = 1,
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
}
我希望根据此枚举对结果进行排序。
答案 0 :(得分: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,则ORDER BY子句更简单:
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>
答案 1 :(得分:1)
order by
case to_char(datecol, 'D')
when 1 then 2
when 2 then 3
...
when 7 then 1
end
答案 2 :(得分:1)
我已经推荐了APC解决方案,这是最好的/正确的方法。
但是,我想添加一个适用于一组任意数据排序的一般情况的答案。
(在这种特殊情况下,排序不是任意的 - 我们可以将它写成一个简单的SQL函数 - 所以应该这样做。)
这里的关键是枚举是一个SET。表也是一个集合,因此是一个视图 - 所以只需将您的枚举转换为表或视图,然后在您的SQL查询中,您可以通过此表加入/订购。
如果您需要在许多查询中重复使用它,这将非常有用。
对于像这样的小型固定集,我只需将其硬编码到视图中 - 对于较大的集合,索引表会更好。
诚实 - 如果它是真正的一次性 - 如果我知道订单只会在单个查询中使用 - 我会在主要答案中使用CASE方法。