Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 параметризованная сортировка  [new]
сортировщик
Guest
Почему так работает
ORDER BY decode(p_sort,1,sysdate-reg_date,2,reg_date)
а так не работает
ORDER BY decode(p_sort,1,reg_date,2,sysdate-reg_date)

И вообще есть ли другой способ сделать порядок сортировки в зависимости от параметра?
17 ноя 10, 13:54    [9794827]     Ответить | Цитировать Сообщить модератору
 Re: параметризованная сортировка  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
сортировщик,

with t as (select cast((sysdate-10+level) as date) reg_date from dual connect by level<10)
select dump(sysdate-reg_date) d1, dump(sysdate) d1,dump(reg_date) from t
 where rownum=1;

Это поясняет?
17 ноя 10, 14:13    [9795047]     Ответить | Цитировать Сообщить модератору
 Re: параметризованная сортировка  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
сортировщик,

RTFM decode. Decode result datatype is determined by first decoded expression datatype. In:

ORDER BY decode(p_sort,1,reg_date,2,sysdate-reg_date)

first decoded expression datatype date and second decoded expression datatype is number. Since there is no implicit conversion from number to date, it fails.

SY.

Сообщение было отредактировано: 17 ноя 10, 14:29
17 ноя 10, 14:20    [9795128]     Ответить | Цитировать Сообщить модератору
 Re: параметризованная сортировка  [new]
JaRo
Member

Откуда:
Сообщений: 1659
сортировщик
И вообще есть ли другой способ сделать порядок сортировки в зависимости от параметра?
Делить по типам:
ORDER BY decode(p_sort,1,reg_date), decode(p_sort,2,sysdate-reg_date)
17 ноя 10, 14:28    [9795226]     Ответить | Цитировать Сообщить модератору
 Re: параметризованная сортировка  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
SY
RTFM decode.


Actually, it is not that straight-forward. It appears DECODE treats date diff as julian date, not as number:

SQL> select deptno from emp
  2  order by decode(deptno,10,hiredate,sysdate-hiredate)
  3  /
order by decode(deptno,10,hiredate,sysdate-hiredate)
                                          *
ERROR at line 2:
ORA-00932: inconsistent datatypes: expected DATE got DATE JULIAN

SQL> select deptno,decode(deptno,10,sysdate-hiredate,hiredate) from emp
  2  order by decode(deptno,10,sysdate-hiredate,hiredate)
  3  /

    DEPTNO DECODE(DEPTNO,10,SYSDATE-HIREDATE,HIREDATE)
---------- -------------------------------------------
        10                                  10525.2721
        10                                  10592.2721
        10                                  10753.2721
        20                                     2444591
        30                                     2444656
        30                                     2444658
        20                                     2444697
        30                                     2444726
        30                                     2444856
        30                                     2444876
        30                                     2444942

    DEPTNO DECODE(DEPTNO,10,SYSDATE-HIREDATE,HIREDATE)
---------- -------------------------------------------
        20                                     2444942
        20                                     2446905
        20                                     2446939

14 rows selected.

SQL>  select deptno from emp
  2  order by decode(deptno,10,99,hiredate)
  3  /
order by decode(deptno,10,99,hiredate)
                             *
ERROR at line 2:
ORA-00932: inconsistent datatypes: expected NUMBER got DATE


SQL> 

SY.

Сообщение было отредактировано: 17 ноя 10, 14:32
17 ноя 10, 14:28    [9795229]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить