Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:如何在脚本中获取和设置枚举列表变量?_Postgresql - Fatal编程技术网

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

PostgreSQL:如何在脚本中获取和设置枚举列表变量?,postgresql,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 要克服的问题是:需要文字输入

我在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
要克服的问题是:需要文字输入。您不能直接将查询结果提供给它

解决方法之一:动态SQL,如:

DO
$$
BEGIN
   EXECUTE format(
      'SET mycustom.var = %L'
     , ARRAY(
         SELECT *
         FROM   generate_series(1, 10) 
         ORDER  BY random()
         LIMIT  6
         )::text
      );
END
$$;
或使用:

然后:

小提琴


这将返回一个整数数组:int[]

临时职能是另一种选择。可能具有内置的动态结果,而此解决方案仅存储结果,不可变:

使用

当然,设置类型为文本:

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)    

嗯,我有两个错误:[代码:,SQL状态:42601]错误:开始位置或附近的语法错误:4[代码:,SQL状态:42601]错误:选择位置或附近的语法错误:7对我有效,我用Postgres 11进行了测试。查看添加的fiddle。它返回一个整数数组:int[]。你需要一份实际的清单吗?如果是,具体是什么形式和数据类型?如果您运行的是过期版本的Postgres,则需要声明该版本。
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)