powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Case внутри order by
17 сообщений из 17, страница 1 из 1
Case внутри order by
    #38476088
TorchTTTT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица:
Код: 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
Case внутри order by
    #38476098
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorchTTTTПодскажите, пожалуйста, как работает данная сортировка?
Добавь это выражение в список select и увидишь возвращаемые им значения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Case внутри order by
    #38476100
TorchTTTT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Спасибо за комментарий.

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

буду искренне рад, если опишите по шагам как работает сортировка с case.
...
Рейтинг: 0 / 0
Case внутри order by
    #38476103
TorchTTTT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица:
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
Case внутри order by
    #38476104
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавляется виртуальное поле с результатом case и по нему сортируется
...
Рейтинг: 0 / 0
Case внутри order by
    #38476112
TorchTTTT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257

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

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

Вот и тут - расматривайте case как некую функцию, возвражающую значение.
...
Рейтинг: 0 / 0
Case внутри order by
    #38476574
TorchTTTT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Case внутри order by
    #38476579
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorchTTTTЕсли результат case один для всей таблицы, то тогда понятно, если для каждой строки применяется case - тогда вопрос каким обраом сортируются данные.case - это выражение, такое же как все остальные выражения. Оно может содержать в себе другие выражения и/или содержаться в других выражениях.

Значения выражений в секции ORDER BY вычисляются для каждой строки и уже эти результаты сортируются.
...
Рейтинг: 0 / 0
Case внутри order by
    #38477117
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Case внутри order by
    #38477121
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Case внутри order by
    #38477281
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Case внутри order by
    #38477335
TorchTTTT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перечитал свои сообщения, имеюются логические опечатки и иногда путал сортировку по столбцу first_column и second_column

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

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

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

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

Для каждой строки вычисляется значение 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
Case внутри order by
    #38477694
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TorchTTTT MasterZiv
Значение выражения Order by вычислется один раз для всей таблицы или для каждой строки отдельно? Если для всей таблицы - тогда должна быть сортировка по полю first_column, если для каждой строки в отдельности - другой способ.Ужас.
TorchTTTTДля каждой строки вычисляется значение case и, далее, таблица сортируется по этому значению.Ну так об этом много раз и сказали - по значению, а не по полям.
...
Рейтинг: 0 / 0
Case внутри order by
    #38477811
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Значение выражения Order by вычислется один раз для всей таблицы или для каждой строки отдельно?

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

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


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

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


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


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