0

我想对我的 oracle 数据库中的表执行特殊查询。

我希望根据我拥有的枚举对结果进行排序。

枚举如下:

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

我希望根据这个枚举对结果进行排序。

4

3 回答 3

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 参数的设置。 了解更多

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> 
于 2010-07-03T06:47:00.060 回答
1

我赞成 APC 解决方案,这是最好/正确的方法。

但是,我想添加一个适用于按任意数据集排序的一般情况的答案。

(在这种特定情况下,排序不是任意的——我们可以将其编写为简单的 SQL 函数——应该如此)。

这里的关键是枚举是一个 SET。一个表也是一个集合,一个视图也是一个集合 - 所以只需将您的枚举转换为一个表或视图,然后在您的 SQL 查询中,您可以通过该表加入/排序。

如果您需要在许多查询中重复使用它,这将特别有用。

对于像这样的小型固定集,我只需将其硬编码到视图中 - 对于较大的集,索引表会更好。

老实说 - 如果它是真正的一次性 - 如果我知道排序只会在单个查询中使用 - 我会在主要答案中使用 CASE 方法。

于 2010-07-03T08:01:16.267 回答
1
order by
  case to_char(datecol, 'D')
    when 1 then 2
    when 2 then 3
    ...
    when 7 then 1
  end
于 2010-07-02T22:46:47.517 回答