gpt4 book ai didi

sql - 如何在 PostgreSQL 9.6 及更低版本中对数组进行洗牌?

转载 作者:行者123 更新时间:2023-11-29 11:55:01 24 4
gpt4 key购买 nike

以下自定义存储函数-

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 函数。

更新:

回复 Tom Lane :

目标列表中 SRF 的扩展现在发生在 ORDER BY 之后。所以 ORDER BY 正在对单个虚拟行进行排序,然后是 unnest在那之后发生。见

https://git.postgresql.org/gitweb/?p=postgresql.git&a=commitdiff&h=9118d03a8

最佳答案

一般来说,一个set返回函数应该放在FROM子句中:

select array_agg(u order by random())
from unnest(array['a','b','c','d','e','f']) u

array_agg
---------------
{d,f,b,e,c,a}
(1 row)

对于 the documentation (强调):

Currently, functions returning sets can also be called in the select list of a query. For each row that the query generates by itself, the function returning set is invoked, and an output row is generated for each element of the function's result set. Note, however, that this capability is deprecated and might be removed in future releases.

关于sql - 如何在 PostgreSQL 9.6 及更低版本中对数组进行洗牌?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42179012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com