以随机顺序从 JSON 数组中获取元素
Posted
技术标签:
【中文标题】以随机顺序从 JSON 数组中获取元素【英文标题】:Get elements from JSON array in random order 【发布时间】:2015-08-26 12:14:22 【问题描述】:使用 PostgreSQL 9.4,我将数据作为 JSON 数组存储在 plpgsql 代码中,例如:
j := '[1,2,3,4,5]'::json
接下来我遍历这个数组并对数字做一些事情。
FOR i1 IN 0..(json_array_length(j)-1) LOOP
RAISE NOTICE 'i1=%', j->>(i1);
END LOOP;
我得到这个输出:
1
2
3
4
5
如何获得循环的随机排序顺序?喜欢:
3
5
1
2
4
【问题讨论】:
我要问...为什么?基本任务是什么,你试图通过这样做来解决什么问题? 想象一下图像 ID 数组,有时我想查看按 ID 排序的图像,有时是随机的。获取图像数组的客户是第三方,我无法控制他们的顺序。 【参考方案1】:保持简单,只需使用json_array_elements_text
和ORDER BY random()
。
DECLARE
item text
BEGIN
FOR item IN
SELECT json_array_elements_text('[1,2,3,4,5]'::json) ORDER BY random()
LOOP
RAISE NOTICE 'item is %',item;
END LOOP;
END;
【讨论】:
【参考方案2】:使用 generate_series():
select '[1,2,3,4,5]'::json->>(i)
from generate_series(0, 4) i
order by random();
【讨论】:
【参考方案3】:-
创建新的键数组(从 0 到 4)
SELECT INTO intarray array_agg(s.n)
FROM (SELECT generate_series(0,json_array_length(j)-1) AS n
ORDER BY random()) s
-
在主循环中,通过新数组中的值从 j 数组中获取值
FOR i1 IN 0..(json_array_length(j)-1) LOOP
RAISE NOTICE 'i1=%', j->>(intarray[i1]);
END LOOP;
【讨论】:
以上是关于以随机顺序从 JSON 数组中获取元素的主要内容,如果未能解决你的问题,请参考以下文章