Oracle按照两列中最大值进行排序
Oracle按照两列中最大值进行排序
假设Oracle有下面的一张表:
- CREATE TABLE FOO(
- FOOID NUMBER(10),
- FIRSTCOL NUMBER(10),
- SECONDCOL NUMBER(10)
- );
为了方便测试,随机产生一些数据:
- DECLARE
- N_FOOID FOO.FOOID%TYPE;
- N_FIRSTCOL FOO.FIRSTCOL%TYPE;
- N_SECOND FOO.SECONDCOL%TYPE;
- BEGIN
- N_FOOID :=0;
- DELETE FROM FOO;
- FOR I IN 0 .. 200 LOOP
- N_FOOID := N_FOOID+1;
- SELECT TRUNC(DBMS_RANDOM.VALUE(0, 200)),
- TRUNC(DBMS_RANDOM.VALUE(0, 200))
- INTO N_FIRSTCOL,N_SECOND
- FROM DUAL;
- INSERT INTO FOO(FOOID,FIRSTCOL,SECONDCOL)
- VALUES(N_FOOID,N_FIRSTCOL,N_SECOND);
- END LOOP;
- END;
下面是生成的数据:
- FOOID FIRSTCOL SECONDCOL
- 1 1 19
- 2 134 172
- 3 25 176
- 4 99 56
- 5 41 17
- 6 65 55
- 7 73 0
要求: 需要按照FIRSTCOL与SECONDCOL中的最大值进行排序。
第一个解决方案:
- SELECT *
- FROM FOO T
- ORDER BY (CASE WHEN T.FIRSTCOL>T.SECONDCOL THEN T.FIRSTCOL ELSE T.SECONDCOL END);
第二个解决方案:
- SELECT *
- FROM FOO T
- ORDER BY GREATEST(T.FIRSTCOL,T.SECONDCOL);
第二个方案明显要比第一种写法好很多,如果是在多列的情况下进行比较,因为总不可能写N多的CASE WHEN THEN ELSE END来进行多行的取最大值。看来Oracle总是比我们考虑的多一些,因此提供了GREATEST这个函数。
评论暂时关闭