Следующая заказ хранимая функция -Как перетасовать массив в PostgreSQL 9.6, а также более низкие версии?
CREATE OR REPLACE FUNCTION words_shuffle(in_array varchar[])
RETURNS varchar[] AS
$func$
SELECT array_agg(letters.x) FROM
(SELECT UNNEST(in_array) x ORDER BY RANDOM()) letters;
$func$ LANGUAGE sql STABLE;
был перетасовки массив символов в PostgreSQL 9.5.3:
words=> select words_shuffle(ARRAY['a','b','c','d','e','f']);
words_shuffle
---------------
{c,d,b,a,e,f}
(1 row)
Но теперь после того, как я перешел на PostgreSQL 9.6.2 функция перестал работать:
words=> select words_shuffle(ARRAY['a','b','c','d','e','f']);
words_shuffle
---------------
{a,b,c,d,e,f}
(1 row)
Возможно, потому что ORDER BY RANDOM() прекратил работать:
words=> select unnest(ARRAY['a','b','c','d','e','f']) order by random();
unnest
--------
a
b
c
d
e
f
(6 rows)
Я ищу, пожалуйста, лучший способ перетасовать массив символов, который будет работать в новом PostgreSQL 9.6, но также и в 9.5.
Мне нужен он для my word game в разработке, который использует функции Pl/PgSQL.
UPDATE:
Ответить на Tom Lane:
Расширение СРР в TargetList происходит сейчас после ORDER BY. Таким образом, ORDER BY сортирует одну фиктивную строку, а затем после этого происходит нечувствительность . См
https://git.postgresql.org/gitweb/?p=postgresql.git&a=commitdiff&h=9118d03a8
Разница между предложением 'from' и' select' действительно не имеет никакого отношения к тому, почему это перестало работать. Хотя ответ правильный и правильное настроение (введите функции генерации строк в предложении 'from'), аргументация отключена. –
У меня никогда не было проблем с этим, поскольку я никогда не использовал SRF в предложении SELECT. Я думаю, что нужно принять это правило, поскольку случай, описанный в вопросе, не является одной известной проблемой, вызванной неправильным использованием SRF. – klin