пытаясь выбрать случайные данные PostgreSQL - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь выбрать случайные строки. Проблема в том, что он возвращает одинаковое значение для каждой строки. Почему это и как исправить?

SELECT array_to_string(ARRAY(SELECT chr((48 + round(random() * 59)) :: integer) 
FROM generate_series(1,40)), '') AS string FROM generate_series(1,10);

Output:
|  string   |
| duplicate |
| duplicate |
| duplicate |
...

10 строк

1 Ответ

1 голос
/ 26 марта 2020

Postgres переоптимизирует подзапрос. Я думаю, что это ошибка, потому что отсутствует тот факт, что random() является изменчивым.

Простое исправление - это предложение о корреляции:

select (select string_agg( chr(48 + (random() * 59)::int), '')
        from generate_series(1 ,40)
        where gs.i is not null
       ) AS string
from generate_series(1, 10) gs(i);

Я немного переписал логи c, так что это проще. Нет необходимости использовать массивы для того, что вы хотите сделать.

Здесь - это db <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...