我想对我的 oracle 数据库中的表执行特殊查询。
我希望根据我拥有的枚举对结果进行排序。
枚举如下:
private enum days
{
Saturday = 1,
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
}
我希望根据这个枚举对结果进行排序。
我想对我的 oracle 数据库中的表执行特殊查询。
我希望根据我拥有的枚举对结果进行排序。
枚举如下:
private enum days
{
Saturday = 1,
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
}
我希望根据这个枚举对结果进行排序。
因此,您的 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 参数的设置。 了解更多。
Oracle 日期格式还允许我们将 DATE 转换为星期几的数字。这是一个文化问题:一些社会将星期一作为一周的第一天,而另一些社会将星期日或星期六。因此 TO_CHAR(some_date, 'D') 将返回 1 的日期,该日期是欧洲的星期一,但美国的日期为 2。这由 NLS_TERRITORY 设置控制。 了解更多。
如果您的区域设置为 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>
我赞成 APC 解决方案,这是最好/正确的方法。
但是,我想添加一个适用于按任意数据集排序的一般情况的答案。
(在这种特定情况下,排序不是任意的——我们可以将其编写为简单的 SQL 函数——应该如此)。
这里的关键是枚举是一个 SET。一个表也是一个集合,一个视图也是一个集合 - 所以只需将您的枚举转换为一个表或视图,然后在您的 SQL 查询中,您可以通过该表加入/排序。
如果您需要在许多查询中重复使用它,这将特别有用。
对于像这样的小型固定集,我只需将其硬编码到视图中 - 对于较大的集,索引表会更好。
老实说 - 如果它是真正的一次性 - 如果我知道排序只会在单个查询中使用 - 我会在主要答案中使用 CASE 方法。
order by
case to_char(datecol, 'D')
when 1 then 2
when 2 then 3
...
when 7 then 1
end