订购选择子句以特定方式生成

时间:2010-07-28 12:38:17

标签: sql database oracle

我需要帮助编写 select 子句查询。

例如,假设我有这样的查询:

select value from some_table order by value asc;

因此我得到了这个:

1
2
3
4
5
6
7
8
9
10

但是我要写的一个特殊查询,仍然会给我排序的值,但会在 8 之后放置 5

这意味着我需要一个值超出常规顺序。

可以用其他方式描述。假设我有两组数字(例子): A = {a | 1< = a< = 118,a!= 78} B = {b | b> 118} 我有一组C = A U B U {78} 我需要将所有这些值排序为“A,78,B”

4 个答案:

答案 0 :(得分:9)

假设值是整数,您可以这样做:

SELECT *
  FROM tbl
ORDER BY
       CASE
         WHEN value = 5 THEN 8.5
         ELSE value
       END

答案 1 :(得分:2)

您可以通过以下方式在订单中使用多个条件:

ORDER BY (value BETWEEN 1 AND 118) AND value != 78 DESC,
         value > 118 DESC,
         value

这将确保首先匹配第一个谓词的值,然后匹配第二个谓词的值,最后匹配任何谓词的值。如果存在平局(两个数字匹配相同的谓词),则这些数字按升序排序。

请注意,我没有在Oracle中对此进行过测试。可能需要将谓词包装在CASE表达式(CASE WHEN predicate THEN 1 ELSE 0 END)中,以使排序在Oracle中有效。

ORDER BY
    (CASE WHEN ((value BETWEEN 1 AND 118) AND value <> 78) THEN 1 ELSE 0 END) DESC,
    (CASE WHEN (value > 118) THEN 1 ELSE 0 END) DESC,
    value

答案 2 :(得分:2)

或者扩展DCP的答案......

SELECT * 
  FROM tbl 
ORDER BY 
       CASE 
         WHEN (Condition for first grouping) THEN 1
         WHEN (Condition for second grouping) THEN 2
         WHEN (Condition for third grouping) THEN 3
         ELSE 4
       END 

答案 3 :(得分:0)

由某些CASE-expression订购以重新映射您的值。