在PostgreSQL中生成多行随机数组?

时间:2018-11-29 01:31:19

标签: postgresql

为了测试数据库,我想生成许多行,每行包含一组固定长度的随机数数组。我可以轻松生成 n 行随机数:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';

import { IonicModule } from '@ionic/angular';

import { AlgodetailPage } from './algodetail.page';

const routes: Routes = [
  {
    path: '',
    component: AlgodetailPage
  }
];

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    IonicModule,
    RouterModule.forChild(routes)
  ],
  declarations: [AlgodetailPage]
})
export class AlgodetailPageModule {}

我可以生成一个随机数数组:

select round(random()*10) from generate_series(1,5);

但是如果将它们放在一起,select array(select round(random()*10) from generate_series(1,5)); 子查询只会执行一次:

array()

如何使子查询针对每一行运行?

1 个答案:

答案 0 :(得分:1)

我使用的功能是

create or replace function random_int_array(int, int)
returns int[] language sql as
$$
    select array_agg(round(random()* $1)::int)
    from generate_series(1, $2)
$$;

select random_int_array(10, 5)
from generate_series(1, 5)

 random_int_array 
------------------
 {3,8,4,7,5}
 {0,10,3,5,4}
 {2,2,0,2,10}
 {8,1,4,3,9}
 {7,4,1,3,6}
(5 rows)

请注意,该函数应该是易失性的。


更新。另一种方法是,生成25个随机值并将它们汇总为5组:

select array_agg(round(random()* 10))
from generate_series(1, 25) i
group by i % 5

db<>fiddle.