PostgreSQL: как получить и установить переменную списка в скрипте? - PullRequest
0 голосов
/ 02 января 2019

Я использую переменные стиля GUC в сценарии SQL следующим образом:

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 голосов
/ 02 января 2019

Использование 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
);

Конечно, параметр имеет тип text:

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)    
0 голосов
/ 02 января 2019

Проблема, которую нужно преодолеть: 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 <> fiddle здесь

Возвращает массив целых чисел:int[].

Альтернативой может быть временная функция.Возможно со встроенным динамическим результатом (в то время как это решение неизменно сохраняет только результат):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...