Oracle 10g-Express查询

时间:2010-07-02 22:38:48

标签: c# oracle sorting oracle-xe date-arithmetic

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

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

枚举如下:

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

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

3 个答案:

答案 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方法。