我有一个foo
表,希望将bar
列设置为一个随机字符串。
update foo
set bar = select string_agg(substring('0123456789bcdfghjkmnpqrstvwxyz', round(random() * 30)::integer, 1), '')
from generate_series(1, 9);
但是它只生成一次随机字符串,然后对所有行重复使用它,我怎样才能使它为每一行生成一个随机字符串呢?
我知道我可以把它变成这样的函数:
create function generate_bar() returns text language sql as $$
select string_agg(substring('0123456789bcdfghjkmnpqrstvwxyz', round(random() * 30)::integer, 1), '')
from generate_series(1, 9)
$$;
然后在更新查询中调用函数,但是我更喜欢不使用函数。
2条答案
按热度按时间oyxsuwqo1#
问题是Postgres优化器太聪明了,它决定对所有行只执行一次子查询,它确实忽略了一些明显的东西--
random()
函数使子查询 volatile,因此这不是适当的行为。解决这个问题的一个方法是使用相关子查询。下面是一个示例:
Here是db〈〉小提琴。
wztqucjr2#
对于最多包含32个字符的随机混合大小写数字字符串,请用途:
并将XXX替换为所需字符串的长度加1。要将所有字符串替换为长度为32的字符串,示例:
14235ccd21a408149cfbab0a8db19fb2
可能是填充其中一行的值。每行将有一个随机字符串,但不保证唯一。用于生成超过32个字符的字符串
只需将上述内容与
CONCAT
结合起来即可