我得到了下面的波斯格雷斯表格:

create table test (
    id serial, 
    contract varchar, 
    amount0 int, 
    amount1 int, 
    price double precision
);

我想插入100行符合以下条件的虚拟数据:

-在‘Contact’一栏中,应该有‘ABC’、‘KLM’和‘XYZ’以外的值.

-在列‘accumt0’和‘mount 1’中,应包含50、60、80、100、200之间的整数值.

-在价格栏中,应该有1.5、1.8、2.1、2.5之间的值.

到目前为止,我得出的结论是:

INSERT INTO test (amount0, amount1, price)
SELECT
  (SELECT val FROM unnest(ARRAY[50, 60, 80, 100, 200]) AS val ORDER BY random() LIMIT 1),
  (SELECT val FROM unnest(ARRAY[50, 60, 80, 100, 200]) AS val ORDER BY random() LIMIT 1),
  (SELECT val FROM unnest(ARRAY[1.5, 1.8, 2.1, 2.5]) AS val ORDER BY random() LIMIT 1)
FROM generate_series(1, 100);

但这并没有起到作用.该语句始终只使用‘100’表示‘mont0’列,‘50’表示‘mont1’列,‘2.1’表示‘Price’列.

有谁能帮帮我吗?

推荐答案

你可以 Select 的数组:(demo)

INSERT INTO test (contract,amount0, amount1, price)
SELECT (ARRAY['abc','klm','xyz'])[(random()*2+1)::int],
       (ARRAY[50, 60, 80, 100, 200])[(random()*4+1)::int],
       (ARRAY[50, 60, 80, 100, 200])[(random()*4+1)::int],
       (ARRAY[1.5, 1.8, 2.1, 2.5])[(random()*3+1)::int]
FROM generate_series(1, 1e2, 1);

SELECT id, contract,amount0, amount1, price FROM test LIMIT 6;
id contract amount0 amount1 price
1 klm 50 100 2.1
2 xyz 100 100 1.5
3 abc 80 100 1.8
4 xyz 80 80 2.1
5 xyz 200 50 1.8
6 xyz 60 60 1.8

请注意,这会执行您想要执行的操作,使每个 Select 都独立随机.实际上,您很可能会得到重复的条目.如果你想一直得到独特的组合,直到用完,然后才重新开始,你可以做一些类似Mike's suggestion的事情:(demo2)

INSERT INTO test (contract,amount0, amount1, price)
SELECT contract,amount0, amount1, price
FROM (values (50),(60),(80),(100),(200)) a(amount0),
     (values (50),(60),(80),(100),(200)) b(amount1),
     (values (1.5), (1.8), (2.1), (2.5)) c(price),
     (values ('abc'),('klm'),('xyz')   ) d(contract),
     generate_series(1, 1e2, 1) duplicator(n)
order by n, random()
limit 100;

Here's a function如果你发现自己需要一个weighted随机数,这意味着你想要定义一个选项相对于其他选项的确切可能性有多大.


您的解决方案不起作用的原因是,因为您的标量子查询不以任何方式依赖于外部查询,所以它们只被判断一次并被重用.你可以通过运行explain analyze verbose来判断计划.could通过添加外部引用欺骗规划者,使其认为他们以某种方式依赖于外部查询,即使它什么也不做(demo3),但上面的代码用更少的代码做了同样的事情.

Sql相关问答推荐

在SQL:2003(PGQ)中,Cypher查询语言、GQL、PGQL和属性图查询的常见子集是什么?'

判断Pyspark生成的SQL查询

如何在PostgreSQL中同时为id s列表执行多个update语句?'

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

基于前面行的值:当x&>2时重复1,当连续3行x=0时则重复0

前面的语句不喜欢AND LIKE?当try 更新使用ID和日期过滤的表时

替换条件中的单元格值

基于唯一值在Access查询中创建计数器

每小时 Select 1行

当active=1时,是否可以创建id为的唯一索引?

Proc SQL Select Distinct SAS

日期逻辑(查找过go 90 天内的第一个匹配行)

在 PostgreSQL 中,如何让多个判断约束引用相同的值数组?

Oracle 21c 中的递归查询回顾过go 3 周

SQL的左连接在多对多关系情况下使用

正则表达式忽略特定数据部分的分隔符

使用给定的变量对在循环中执行更新语句

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

如何按日期和位置对最近 3 个报告日期的 SQL 查询结果进行透视?

Django only() 和 values() 不适用于 prefetch_related()