PostgreSQL:如何在脚本中获取和设置枚举列表变量?

时间:2019-01-02 18:26:52

标签: postgresql

我在这样的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

2 个答案:

答案 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)

使用set_config()

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)