Oracle针对不同条件下订单

时间:2014-09-25 07:16:17

标签: sql oracle

我有一个查询,我想根据条件做出两种顺序。

例如,如果某个字段为NULL,我需要订单,如果不是,我必须再订购。我怎么能这样做?

select *
  from table_1 t
  order by (if  t.field1 is null then
                   order by t.field2 DESC, field3 ASC
            else 
                  order by t.field4 ASC, field5 DESC)

这是一个示例代码:我想根据FIELD1的值做出不同的顺序(ASC / DESC和不同的列)

示例

条件

ID FIELD1  FIELD2  FIELD3  FIELD4  FIELD5
1   1       2       3       4       5
2   NULL    6       7       8       9

DATA

ID PARENT_ID DATA1 DATA2 DATA3
1  1         X     Y     J
2  1         Z     W     U
3  2         XY    YX    O
4  2         ZW    WZ    I

select d.*
  from data d, conditional c
 where d.parent_id = c.id
   and d.parent_id = 1
order by
       case 
           when c.field1 is null then
              data1 asc, data2 desc
           else
              data3 asc, data1 desc
       end

在这个例子中,我选择DATA行ONE和TWO(父id = 1的行)。 现在我做出了这个决定,我想根据CONDICTIONAL.FIELD1列的值来删除DATA列。我希望现在更干净。

当然这个查询会有效,但这是“我需要的东西。”

2 个答案:

答案 0 :(得分:7)

您可以在CASE子句中构建ORDER BY

SQL> SELECT * FROM EMP T
  2  ORDER BY
  3  CASE
  4     WHEN COMM IS NULL
  5     THEN SAL
  6     ELSE EMPNO
  7  END
  8  /

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

14 rows selected.

注意:注意DATA TYPE子句中列的ORDER BY

答案 1 :(得分:4)

正如Lalit Kumar B所说,在case条款中使用order by。您不能在案例中指定两个值或asc / desc,因此您需要按两个重复相同条件的case子句进行排序:

select d.*
  from data d, conditional c
 where d.parent_id = c.id
   and d.parent_id = 1
order by
       case when c.field1 is null then d.data1 else d.data3 end asc,
       case when c.field1 is null then d.data2 else d.data1 end desc;

为您的样本数据提供:

        ID  PARENT_ID DATA1 DATA2 DATA3
---------- ---------- ----- ----- -----
         1          1 X     Y     J     
         2          1 Z     W     U     

或使用正确的连接语法并避免使用select *

select d.id, d.parent_id, d.data1, d.data2, d.data3
  from data d
  join conditional c
    on c.id = d.parent_id
 where d.parent_id = 1
order by
       case when c.field1 is null then d.data1 else d.data3 end asc,
       case when c.field1 is null then d.data2 else d.data1 end desc;

Simple SQL Fiddle