Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 nulls first  [new]
Guest 2010
Guest
Как разрулить?

SELECT a, b, c
FROM mytab
ORDER BY case when 1 = 1 then b nulls first else c nulls last end, case when 1=1 then c nulls last else b nulls first end

Проблема в проклятых nulls, они не понимаются конструкцией case.
А они здесь существенны...
11 май 10, 17:46    [8756199]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
juras
Member

Откуда: Прага
Сообщений: 257
Guest 2010,

ORDER BY case when 1 = 1 then nvl(b, -9999999)  -- nulls first 
else nvl(c, 9999999) -- nulls last 
end
11 май 10, 17:54    [8756250]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Guest 2010,

Приведите пример данных через with и что хотите получить в csv-теге.
11 май 10, 17:54    [8756262]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Guest 2010
Как разрулить?

SELECT a, b, c
FROM mytab
ORDER BY case when 1 = 1 then b nulls first else c nulls last end, case when 1=1 then c nulls last else b nulls first end

Проблема в проклятых nulls, они не понимаются конструкцией case.
А они здесь существенны...


как понимать?

вам клиенстское приложение дает правила сортировки или как?
11 май 10, 17:55    [8756271]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Guest 2010
.. Проблема в проклятых nulls, они не понимаются конструкцией case.
А они здесь существенны...


проблема в том, что вы не понимаете что такое case или/и order by
11 май 10, 18:00    [8756329]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Guest 2010
Как разрулить?

SELECT a, b, c 
  FROM mytab
 ORDER BY case when 1 = 1 then b nulls first else c nulls last end, case when 1=1 then c nulls last else b nulls first end
Проблема в проклятых nulls, они не понимаются конструкцией case.
А они здесь существенны...


...
 ORDER BY case when 1 = 1 then b end nulls first
        , case when not 1 = 1 then c end nulls last
        , case when 1 = 1 then c end nulls last
        , case when not 1 = 1 then b end nulls first
11 май 10, 18:03    [8756344]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
Guest 2010
Guest
Спасибо всем!
juras, suppler - вам особенно!
11 май 10, 18:08    [8756380]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
suPPLer
Guest 2010
Как разрулить?

SELECT a, b, c 
  FROM mytab
 ORDER BY case when 1 = 1 then b nulls first else c nulls last end, case when 1=1 then c nulls last else b nulls first end
Проблема в проклятых nulls, они не понимаются конструкцией case.
А они здесь существенны...


...
 ORDER BY case when 1 = 1 then b end nulls first
        , case when not 1 = 1 then c end nulls last
        , case when 1 = 1 then c end nulls last
        , case when not 1 = 1 then b end nulls first

Сортировку по одному столбцу невозможно заменить сортировкой по нескольким.
Возьмем пример. Пусть будет изначальное условие автора, только заменим бредовое условие 1=1 на a=1, то есть:
"case when a = 1 then b nulls first else c nulls last end, case when a=1 then c nulls last else b nulls first end" - не по синтаксису, но мысль ясна. :)
Имитируется примерно так:
with t as
(select 2 a, 11 b, null c from dual
union all select 2 a, 10 b, 0.1 c from dual
union all select 2 a, 100 b, 2 c from dual
union all select 1 a, 1 b, 3 c from dual
union all select 1 a, null b, null c from dual
union all select 1 a, null b, 0 c from dual)
select t.*,
case when a = 1 then nvl(b,-1e38) else nvl(c,1e38) end x,
case when a = 1 then nvl(c,1e38) else nvl(b,-1e38) end y
from t
order by
case when a = 1 then nvl(b,-1e38) else nvl(c,1e38) end
,case when a = 1 then nvl(c,1e38) else nvl(b,-1e38) end
         A          B          C          X          Y
---------- ---------- ---------- ---------- ----------
         1                     0      -1E38          0
         1                            -1E38       1E38
         2         10        0,1        0,1         10
         1          1          3          1          3
         2        100          2          2        100
         2         11                  1E38         11
 
6 rows selected
Попробуйте теперь отсортировать своим методом.
12 май 10, 15:11    [8761376]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2854
dbms_photoshop
...
Возьмем пример. Пусть будет изначальное условие автора, только заменим бредовое условие 1=1 на a=1...


Попробуйте заменить на :a=1
12 май 10, 15:18    [8761448]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
AlexFF__|
dbms_photoshop
...
Возьмем пример. Пусть будет изначальное условие автора, только заменим бредовое условие 1=1 на a=1...


Попробуйте заменить на :a=1

Не понял.
12 май 10, 15:22    [8761477]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
dbms_photoshop
Попробуйте теперь отсортировать своим методом.


Попробовал, всё ожидаемо, сортируется, как и хотелось ТС. А почему Вы решили, что там идёт сравнение со столбцом? :)

with t as
  (select 11 b, null c from dual
    union all 
   select 10 b, 0.1 c from dual
    union all 
   select 100 b, 2 c from dual
    union all 
   select 1 b, 3 c from dual
    union all 
   select null b, null c from dual
    union all 
   select null b, 0 c from dual)
select t.*,
case when :a = 1 then b end x,
case when :a = 1 then c end y
from t
order by case when :a = 1 then b end nulls first
       , case when not :a = 1 then c end nulls last
       , case when :a = 1 then c end nulls last
       , case when not :a = 1 then b end nulls first;

Смысл в том, что какое-то условие выполняется, и тогда вначале идёт сортировка 1, а потом сортировка 2; либо не выполняется - и сортировка 2 идёт перед сортировкой 1.
12 май 10, 15:24    [8761494]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
dbms_photoshop
Не понял.

SQL> var a number
SQL> exec :a := 1;
 
PL/SQL procedure successfully completed
a
---------
1
 
SQL> 
with t as
(select 2 a, 11 b, null c from dual
union all select 2 a, 10 b, 0.1 c from dual
union all select 2 a, 100 b, 2 c from dual
union all select 1 a, 1 b, 3 c from dual
union all select 1 a, null b, null c from dual
union all select 1 a, null b, 0 c from dual)
select t.*
from t
ORDER BY case when :a = 1 then b end nulls first
        , case when not :a = 1 then c end nulls last
        , case when :a = 1 then c end nulls last
        , case when not :a = 1 then b end nulls first;
 
         A          B          C
---------- ---------- ----------
         1                     0
         1            
         1          1          3
         2         10        0.1
         2         11 
         2        100          2
 
6 rows selected
a
---------
1
 
SQL> exec :a := 2;
 
PL/SQL procedure successfully completed
a
---------
2
 
SQL> 
with t as
(select 2 a, 11 b, null c from dual
union all select 2 a, 10 b, 0.1 c from dual
union all select 2 a, 100 b, 2 c from dual
union all select 1 a, 1 b, 3 c from dual
union all select 1 a, null b, null c from dual
union all select 1 a, null b, 0 c from dual)
select t.*
from t
ORDER BY case when :a = 1 then b end nulls first
        , case when not :a = 1 then c end nulls last
        , case when :a = 1 then c end nulls last
        , case when not :a = 1 then b end nulls first;
 
         A          B          C
---------- ---------- ----------
         1                     0
         2         10        0.1
         2        100          2
         1          1          3
         1            
         2         11 
 
6 rows selected
a
---------
2
 
SQL> 
12 май 10, 15:30    [8761572]     Ответить | Цитировать Сообщить модератору
 Re: nulls first  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
suPPLer
dbms_photoshop
Попробуйте теперь отсортировать своим методом.


Попробовал, всё ожидаемо, сортируется, как и хотелось ТС. А почему Вы решили, что там идёт сравнение со столбцом? :)

Ну... эээ... я не стелепатировал.
Тем не менее, если в запросе с nvl заменить столбец на связанную переменную, то сортирует корректно. А если в Вашем заменить связанную переменную на столбец, то сортирует некорректно.
12 май 10, 15:48    [8761786]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить