Are non-used CTEs never materialized in PostgreSQL 16?
4
votes
1
answer
155
views
I want to return my post rows in one of three sort orders, controlled by a
sorting_param
function parameter. The sorting is complex, doesn't lend itself to a simple ORDER BY CASE ...
. So I'm thinking of writing each sorting into its own CTE, and then picking one of the CTEs as the final output. However, I wouldn't want PostgreSQL to waste time on all three, just the one I selected. So will all three be materialized or only the one I picked? Or is there a better way to do this? PostgreSQL version 16. Simplified code below.
~~~pgsql
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;
~~~
Unfortunately I can't do this:
~~~pgsql
ORDER BY
CASE
WHEN sorting_param = 0 THEN p.date
WHEN sorting_param = 1 THEN p.name
ELSE NULL
END DESC, ...
~~~
Asked by Björn Morén
(143 rep)
Nov 8, 2024, 06:43 AM
Last activity: Nov 9, 2024, 01:21 PM
Last activity: Nov 9, 2024, 01:21 PM