Я думаю, что проблема здесь в том, что в новой версии Postgres есть оптимизатор, который становится умнее и кеширует значение random()
после одного вызова этой функции.
Один обходной путь -заставить новое случайное значение рассчитываться для каждой записи.Мы можем добавить фиктивное предложение WHERE
, чтобы заставить это:
WITH cte AS (
select generate_series(1,10) AS col
)
SELECT col
FROM cte
WHERE col IS NOT NULL
ORDER BY random();
Демо
Вы можете наблюдать в демонстрации, что порядокна самом деле случайный.Тем не менее, в той же демонстрации, если вы выполняете свой оригинальный запрос, порядок не будет случайным.
Редактировать:
Причина, по которой этот трюк работает, заключается в том, что *Предложение 1020 * убеждает оптимизатора в том, что вы действительно заботитесь о значениях, используемых в каждой записи.Поэтому он вызывает функцию в ORDER BY
один раз для каждой записи, а не кэширует ее.