Обнаружено константное выражение в списке order by
Обновлено: 04.11.2024
При попытке использовать DISTINCT, а именно
При попытке использовать DISTINCT, а именно
При попытке использовать DISTINCT, а именно
Я даже объясню почему у вас проблема:
вот у вас в базе есть 2 строки с:
Куда именно надо сортировать "Field2"=foo? в начало списка или в конец списка?
Когда сможете ответить на это - тогда и сможете написать правильный запрос :).
У меня еще один вопрос, есть аналогичный запрос с LIMIT
Да в данном случае так и есть (в других случаях может быть по другому).
Ответ: для правила сортировки (ORDER BY CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END)
сначала будет следовать запись (foo, bar), затем (foo / foo)
Далее выполняем SELECT-выборку поля Field2 (получаем две записи)
Далее выполняем DISTINCT "Field2" и получаем поле Field2 из первой полученной записи, т.е. из (foo, bar).
Потому что в SQL порядок выполнения операций другой. и ORDER BY делается в САМОМ КОНЦЕ (после него только LIMIT/OFFSET).
На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет, у нас остался просто список уникальных Field2.
Следовательно, ORDER BY выполняется до SELECT-выборки и в т.ч. по полям, отсутствующим в предложении SELECT.
А это значит, что на момент ORDER BY есть информация не только о SELECT-полях, но и всех прочих полях записей (в частности, Field3)
Посмотрите план такого запроса и увидите, что сначала выполняется выборка, а потом уже сортировка, которой доступны не только перечисленные в SELECT поля потому, что выборка выбирает не поля, а записи целиком.
Т.е. сначала выбираем, потом сортируем и только после отдаем те поля, что перечислены в SELECT.
Но Maxim Boguk пишет:
автор |
---|
На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет, у нас остался просто список уникальных Field2 |
Здравый смысл на нашей стороне, а вот PostgreSQL - на стороне Maxim Boguk.
причём так работают ВСЕ базы и это ANSI SQL стандарт нравиться вам это или нет.
И на то есть вполне чёткие причины почему так а не иначе.
После distinct остаются уже поля а не записи.
Тем более что требуемое вам поведение достаточно легко реализуется при желании в запросе.
Читайте также: