postgresql 有没有办法强制round在所有生成的条目中都不为null?

m4pnthwp  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(1)|浏览(98)

到目前为止,我有一个问题,有时候round会在某些条目中随机生成null,有没有一种方法可以编辑代码,使其必须生成数组中的5个值之一?沿着此之外,任何人都可以编辑这段代码,其中日期只显示年值为整数,忽略月和日?

with populate_cup_matches as (
  insert into cup_matches 
  select generate_series(1,624680,1) as mid,
         ('{final,semi-final,quarter-final,16,32}'::text[])[random()*5] as round,
         'epoch'::date+'1 year'::interval*floor(random()*53) as year,
         floor(random()*1000000)::int as num_ratings,
         random()*10 as rating
  returning *
)

这是一个额外的好处,但是有没有一种方法可以在整个表中随机生成'salah',直到22218才在一行中生成,并且可能使名称值显示为合法的名称而不是一些代码。谢谢你

insert into public.played_in
select mid,
       case when mid<=22218
          then 'salah'||(gen_random_uuid()::varchar(25))
          else gen_random_uuid()::varchar(30) 
       end as name,
       year,
       random()*11 as position
from populate_cup_matches limit 135960
returning *;

我试着做了一些解决方案,但我对编码很陌生,所以如果我看起来像是在问一些琐碎的问题,我道歉。

dxpyg8gm

dxpyg8gm1#

我相信你可以通过使用floor(random()*5)+1来修复“round”列中的NULL,因为你不能为索引0获取文本数组值。关于名字,尝试https://mockaroo.com/http://randat.com/来获得一个名字列表,然后从中获得结果。
”(《礼记·礼记·礼记》))我不能保证特定数量的行会有这个字符串,但下面是一个基于除以3(大约1/3)行后的余数的建议-“也许”。

WITH populate_cup_matches AS (
  SELECT generate_series(1, 20) AS mid,
         ('{final,semi-final,quarter-final,16,32}'::text[])[floor(random()*5)+1] AS round,
         EXTRACT(YEAR FROM 'epoch'::date + '1 year'::interval * floor(random()*53)) AS year,
         floor(random()*1000000)::int AS num_ratings,
         random()*10 AS rating
),
names AS (
  SELECT *,
         ROW_NUMBER() OVER (ORDER BY random()) AS rnd
  FROM (VALUES
        ('Adrian', 'Wilson'),
        ('Brad', 'Hawkins'),
        ('Arnold', 'Nelson'),
        ('Briony', 'Elliott'),
        ('Kristian', 'Richards'),
        ('Michael', 'Holmes'),
        ('Roman', 'Douglas'),
        ('Edith', 'Rogers'),
        ('Arianna', 'Gibson'),
        ('Abraham', 'Richardson'),
        ('Byron', 'Davis'),
        ('Tess', 'Crawford'),
        ('George', 'Miller'),
        ('Freddie', 'Casey'),
        ('Haris', 'Reed'),
        ('Marcus', 'Barrett'),
        ('Julian', 'Hawkins'),
        ('Carlos', 'Clark'),
        ('Madaline', 'Johnston'),
        ('Charlotte', 'Williams')
       ) AS names (first_name, last_name)
)
SELECT mid, round, num_ratings
       , CONCAT(n.first_name, ' ', CASE WHEN num_ratings % 3 = 0 THEN 'Salah' ELSE n.last_name END) AS name
       , year
FROM populate_cup_matches pcm
INNER JOIN LATERAL (
  SELECT first_name, last_name
  FROM names
  WHERE rnd = 1 + (random() * (pcm.num_ratings % 20))::integer
) AS n ON true

| 中|圆的|num_ratings|姓名|年|
| - -----|- -----|- -----|- -----|- -----|
| 2|四分之一决赛|九三一五三|阿里安娜·萨拉赫|一九九七年|
| 3|三十二|九七八零四|阿诺德·纳尔逊|2012年|
| 3|三十二|九七八零四|迈克尔·霍姆斯|2012年|
| 5个|三十二|630775|卡洛斯·克拉克|二零零八年|
| 六|半决赛|424009|马库斯·巴雷特|一九八二年|
| 六|半决赛|424009|朱利安·霍金斯|一九八二年|
| 七个|十六|二一二一五|伊迪丝·罗杰斯|一九九八年|
| 八|最后|494013|亚伯拉罕·萨拉赫|一九七七年|
| 十个|十六|二六六〇六四|克里斯蒂安·萨拉赫|一九七八年|
| 十一|半决赛|七三九七一一|克里斯蒂安·理查兹|2021年|
| 十三|最后|三九五五八○|阿诺德·萨拉赫|一九七八年|
| 十四|四分之一决赛|516702|迈克尔·萨拉赫|二千年|
| 十六|半决赛|150100|阿诺德·纳尔逊|一九九六年|
| 十八岁|三十二|五四八七○二|迈克尔·霍姆斯|一九七一年|
| 十九|十六|332677|弗雷迪·凯西|一九九二年|
| 二十个|四分之一决赛|10274|阿里安娜·吉布森|一九八三年|
fiddle

nb如果你只想要“year”作为列,那么从生成的日期中“提取”年份-但请注意,该列现在是整数而不是日期!

相关问题