我在这样的SQL脚本中使用GUC样式变量:
set mycustom.var = 5;
select current_setting('mycustom.var');
适用于字符串和整数...但是如何获取和设置枚举的整数列表?
理想情况下,我想使用以下代码用随机唯一值填充枚举列表:
SELECT num
FROM GENERATE_SERIES (1, 10) AS s(num)
ORDER BY RANDOM()
LIMIT 6
答案 0 :(得分:1)
要解决的问题:SET
需要文字输入。您无法直接将查询结果提供给它。
一种解决方法:动态SQL,如:
DO
$$
BEGIN
EXECUTE format(
'SET mycustom.var = %L'
, ARRAY(
SELECT *
FROM generate_series(1, 10)
ORDER BY random()
LIMIT 6
)::text
);
END
$$;
或使用set_config()
:
SELECT set_config('mycustom.var'
, ARRAY(
SELECT *
FROM generate_series(1, 10)
ORDER BY random()
LIMIT 6
)::text
, false);
然后:
SELECT current_setting('mycustom.var')::int[];
db <>提琴here
这将返回一个整数数组:int[]
。
可以使用临时功能。可能带有内置的 dynamic 结果(而该解决方案仅不可变地存储结果):
答案 1 :(得分:1)
select set_config(
'mycustom.list',
(
select array_agg(num)::text
from (
select num
from generate_series (1, 10) as s(num)
order by random()
limit 6
) s
),
false
);
当然,该设置是文本类型:
select current_setting('mycustom.list', true);
current_setting
-----------------
{2,6,1,3,10,8}
(1 row)
但是,您可以轻松地将其转换为行集:
select *
from unnest(current_setting('mycustom.list', true)::int[])
unnest
--------
2
6
1
3
10
8
(6 rows)