我有一个查询,我想根据条件做出两种顺序。
例如,如果某个字段为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列。我希望现在更干净。
当然这个查询会有效,但这是“我需要的东西。”
答案 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;