【发布时间】:2012-07-23 14:39:12
【问题描述】:
在 Bruce Momjian 的博文Generating Random Data Via SQL 中,他使用以下代码生成了 5 个随机字符串:
SELECT
(
SELECT string_agg(x, '')
FROM (
SELECT chr(ascii('a') + floor(random() * 26)::integer)
FROM generate_series(1, 40 + b * 0) as f(g)
) AS y(x)
) AS result
FROM generate_series(1,5) as a(b);
result
------------------------------------------
plwfwcgajxdygfissmxqsywcwiqptytjjppgrvgb
sjaypirhuoynnvqjdgywfsfphuvzqbbilbhakyhf
ngtabkjfqibwahlicgisijatliuwgbcuiwujgeox
mqtnyewalettounachwjjzdrvxbbbpzogscexyfi
dzcstpsvwpefohwkfxmhnlwteyybxejbdltwamsx
(5 rows)
我想知道为什么第 6 行的 'b * 0' 是必需的。当我删除它时,结果变为 5 个完全相同的字符串,这意味着 Postgres 缓存了外部选择表达式(结果)!
我找不到表达式缓存在 Postgres 中的工作方式。根据the documentationrandom() 函数被标记为 VOLATILE,所以,我希望任何依赖它的表达式也是 volatile。
表达式缓存在 Postgres 中是如何工作的?它在任何地方都有记录吗?为什么 'b*0' 禁用了 random() 没有的缓存?
更新:
为了研究这个问题,我将“b * 0”移动到 floor() 调用内部,使其与 random() 处于相同的位置/级别:
...
SELECT chr(ascii('a') + floor(random() * 26 + b * 0)::integer)
FROM generate_series(1, 40) as s(f)
...
结果仍未缓存;不同的字符串。
更新:显示问题的另一个示例
create sequence seq_test;
SELECT (SELECT nextval('seq_test')) FROM generate_series(1,5);
?column?
----------
1
1
1
1
1
(5 rows)
【问题讨论】:
标签: postgresql generate-series