Quero retornar minhas linhas de postagem em uma das três ordens de classificação, controladas por um sorting_param
parâmetro de função. A classificação é complexa, não se presta a um simples ORDER BY CASE ...
. Então, estou pensando em escrever cada classificação em seu próprio CTE e, em seguida, escolher um dos CTEs como a saída final. No entanto, não gostaria que o PostgreSQL perdesse tempo com todos os três, apenas com o que selecionei. Então, todos os três serão materializados ou apenas o que escolhi? Ou há uma maneira melhor de fazer isso? PostgreSQL versão 16. Código simplificado abaixo.
WITH posts_by_order1 AS
(
SELECT p.id
FROM post p
ORDER BY [some complex ordering 1]
LIMIT 10
),
posts_by_order2 AS
(
SELECT p.id
FROM post p
ORDER BY [some complex ordering 2]
LIMIT 10
),
posts_by_order3 AS
(
SELECT p.id
FROM post p
ORDER BY [some complex ordering 3]
LIMIT 10
)
SELECT * FROM posts_by_order1 WHERE sorting_param = 0
UNION ALL
SELECT * FROM posts_by_order2 WHERE sorting_param = 1
UNION ALL
SELECT * FROM posts_by_order3 WHERE sorting_param = 2;
Infelizmente não posso fazer isso:
ORDER BY
CASE
WHEN sorting_param = 0 THEN p.date
WHEN sorting_param = 1 THEN p.name
ELSE NULL
END DESC, ...