Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Case внутри order by / 17 сообщений из 17, страница 1 из 1
25.11.2013, 01:58
    #38476088
TorchTTTT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
Таблица:
Код: java
1.
2.
3.
4.
5.
6.
first_column  second_column
1	      11
1	      12
2	      21
1	      13
2	      22




Внутри order by допускается использование case, например:

Код: plsql
1.
select * from TableTemp order by case when first_column = 1 then first_column else second_column end



Подскажите, пожалуйста, как работает данная сортировка?

Причина вопроса - в столбце first_column помимо значения "1" имеется "2".
...
Рейтинг: 0 / 0
25.11.2013, 02:47
    #38476098
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
TorchTTTTПодскажите, пожалуйста, как работает данная сортировка?
Добавь это выражение в список select и увидишь возвращаемые им значения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.11.2013, 02:57
    #38476100
TorchTTTT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
Dimitry Sibiryakov
Спасибо за комментарий.

Добавлял. Именно по этой причине и возник вопрос.

буду искренне рад, если опишите по шагам как работает сортировка с case.
...
Рейтинг: 0 / 0
25.11.2013, 03:18
    #38476103
TorchTTTT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
Таблица:
3 31
3 32
4 23
1 11
1 12
2 21
1 13
2 22


Я верно понял, что все строки, в которых first_column = 1 сортируются по second_column, а все строки, в которых first_column !=1 - по first_column?

Если да, то в случае наличия в первом столбце "1" и отличных значений - получается, что блок с "1" в первом столбце может произвольно находится как перед остальными отсортированными значения "2", "3" и "4", так и после остальной отсортированной группы?
...
Рейтинг: 0 / 0
25.11.2013, 03:34
    #38476104
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
добавляется виртуальное поле с результатом case и по нему сортируется
...
Рейтинг: 0 / 0
25.11.2013, 04:36
    #38476112
TorchTTTT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
SERG1257

Извините, не понял?
В case указано 2 способа сортировки при различных условиях. Каким образом запрос определяет каким именно способом сортировать?
...
Рейтинг: 0 / 0
25.11.2013, 05:15
    #38476117
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
Сортировка идет по выражению которое вычисляется как результат case.
...
Рейтинг: 0 / 0
25.11.2013, 09:05
    #38476161
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
TorchTTTTВ case указано 2 способа сортировки при различных условиях. Каким образом запрос определяет каким именно способом сортировать?case - это не указание полей :-)

Например, если вы будете сортировать по ПОЛЕ1+ПОЛЕ2, то это значит, что будет сортировка по числу - значению суммы полей, а не по полям ПОЛЕ1 и ПОЛЕ2

Вот и тут - расматривайте case как некую функцию, возвражающую значение.
...
Рейтинг: 0 / 0
25.11.2013, 13:49
    #38476574
TorchTTTT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
SERG1257
Результат выполнения запроса по последней таблице:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
first_column  second_column
2	      22
2	      21
3	      31
3	      32
4	      23
1	      11
1	      12
1	      13



Если опираться на предикат, то если в таблице хотя бы одно значение first_column равно "1", то таблица должна сортироваться по столбцу second_column, в противном случае - по первому столбцу. Тем не менее, в последнем столбце отсутсвует подобная сортировка.

Учитывая результат запроса создается ощущение, что все строки со значеним "1" в столбце first_column были отсортированы по столбцу second_column, а все строки с отличным от "1" значением в столбце first_column отсортированы по столбцу first_column. Получившиеся 2 группы сортировок объеденены в произвольном порядке, когда одна предшествует другой или наоборот.

alexeyvg
Несколько не понял вас.

Если результат case один для всей таблицы, то тогда понятно, если для каждой строки применяется case - тогда вопрос каким обраом сортируются данные.
...
Рейтинг: 0 / 0
25.11.2013, 13:53
    #38476579
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
TorchTTTTЕсли результат case один для всей таблицы, то тогда понятно, если для каждой строки применяется case - тогда вопрос каким обраом сортируются данные.case - это выражение, такое же как все остальные выражения. Оно может содержать в себе другие выражения и/или содержаться в других выражениях.

Значения выражений в секции ORDER BY вычисляются для каждой строки и уже эти результаты сортируются.
...
Рейтинг: 0 / 0
25.11.2013, 17:49
    #38477117
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
TorchTTTT alexeyvg
Несколько не понял вас.

Если результат case один для всей таблицы, то тогда понятно, если для каждой строки применяется case - тогда вопрос каким обраом сортируются данные.Замените в рассуждениях CASE на "+", может, так легче понять.

SELECT поле1, поле2, поле1+поле2 AS [сумма полей]
FROM таблица
ORDER BY поле1+поле2

Вернёт:
1 2 3
2 2 4
1 4 5
...
Рейтинг: 0 / 0
25.11.2013, 17:54
    #38477121
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
alexeyvgTorchTTTT alexeyvg
Несколько не понял вас.

Если результат case один для всей таблицы, то тогда понятно, если для каждой строки применяется case - тогда вопрос каким обраом сортируются данные.Замените в рассуждениях CASE на "+", может, так легче понять.

SELECT поле1, поле2, поле1+поле2 AS [сумма полей]
FROM таблица
ORDER BY поле1+поле2

Вернёт:
1 2 3
2 2 4
1 4 5То есть, ещё раз, CASE - это не выбор полей, это скалярное выражение, возвражающее одно значение некоторого типа, такая же функция, другие, например: экспонента, квадратный корень, конкатенация строки, получение дня недели из даты и т.п.

Подумайте, если вы будете сортировать по квадратному корню из суммы полей: результат квадратного корня один для всей таблицы или применяется для каждой строки, и как в итоге бдет отсортировано?
...
Рейтинг: 0 / 0
25.11.2013, 20:22
    #38477281
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
TorchTTTT Dimitry Sibiryakov
Спасибо за комментарий.

Добавлял. Именно по этой причине и возник вопрос.

буду искренне рад, если опишите по шагам как работает сортировка с case.


Вычисляются значения выражений в ORDER BY
( в данном случае одно выражение - case when first_column = 1 then first_column else second_column end )

набор данных сортируется по значениям полученных выражений.


Ты вероятно хотел написать не так, а

Код: sql
1.
2.
3.
ORDER BY 
   case when first_column = 1 then first_column else null end, 
   case when first_column = 1 then null else second_column end
...
Рейтинг: 0 / 0
25.11.2013, 21:28
    #38477335
TorchTTTT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
Перечитал свои сообщения, имеюются логические опечатки и иногда путал сортировку по столбцу first_column и second_column

MasterZiv
Значение выражения Order by вычислется один раз для всей таблицы или для каждой строки отдельно? Если для всей таблицы - тогда должна быть сортировка по полю first_column, если для каждой строки в отдельности - другой способ.

Нет, я не хотел писать два case)
...
Рейтинг: 0 / 0
25.11.2013, 21:59
    #38477353
TorchTTTT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
Благодарю всех за ответы.

Вопрос решен.

Алгоритм сортировки:

Для каждой строки вычисляется значение case и, далее, таблица сортируется по этому значению.
Пример сортировки таблицы Tabletemp (в столбце Case_Value приведено значение case для каждой строки, по которому и будет происходить сортировка):

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
first_column  second_colum  Case_Value
2	      22	      2
2	      21	      2
3	      31	      3
3	      32	      3
4	      23	      4
1	      11	      11
1	      12	      12
1	      13	      13
...
Рейтинг: 0 / 0
26.11.2013, 09:58
    #38477694
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
TorchTTTT MasterZiv
Значение выражения Order by вычислется один раз для всей таблицы или для каждой строки отдельно? Если для всей таблицы - тогда должна быть сортировка по полю first_column, если для каждой строки в отдельности - другой способ.Ужас.
TorchTTTTДля каждой строки вычисляется значение case и, далее, таблица сортируется по этому значению.Ну так об этом много раз и сказали - по значению, а не по полям.
...
Рейтинг: 0 / 0
26.11.2013, 11:04
    #38477811
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Case внутри order by
MasterZiv
Значение выражения Order by вычислется один раз для всей таблицы или для каждой строки отдельно?

Это как один раз для всей таблицы, если они зависят от полей каждой записи?

Если не зависят, могут вычисляются и один раз.


Если для всей таблицы - тогда должна быть сортировка по полю first_column, если для каждой строки в отдельности - другой способ.

Нет, я не хотел писать два case)


Хотел, хотел... :-)
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Case внутри order by / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]