【问题标题】:Get elements from JSON array in random order以随机顺序从 JSON 数组中获取元素
【发布时间】: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 排序的图像,有时是随机的。获取图像数组的客户是第三方,我无法控制他们的顺序。

标签: sql json postgresql plpgsql


【解决方案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】:
      1. 创建新的键数组(从 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
      
      1. 在主循环中,通过新数组中的值从 j 数组中获取值
      FOR i1 IN 0..(json_array_length(j)-1) LOOP
      
         RAISE NOTICE 'i1=%', j->>(intarray[i1]);
      
      END LOOP;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多