以随机顺序从 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_textORDER 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 数组中获取元素的主要内容,如果未能解决你的问题,请参考以下文章

jquery将元素移动到随机顺序

如何从数组中获取随机元素[重复]

sampleSize - 从数组中随机获取 n 个元素

试图从 API 获取 json 中非对象的属性

php中如果从一堆元素中随机出2个元素,举个例子:张三,李四,王五,刘六...有十个名字,

在greenplum pxf外部表中,从对象的json数组中获取元素时获取空字符串