Выбор массивов в красиво напечатанном формате в SQL - PullRequest
1 голос
/ 30 сентября 2011

Я пытаюсь выбрать для двумерного массива целых чисел и направить вывод в файл.Есть ли какой-нибудь способ, которым я могу написать оператор postgresql, который бы сделал вывод команды select красиво отформатированным.Как и в каждом массиве целых чисел, элемент 2D-массива находится на отдельной строке.

Прямо сейчас я просто получаю этот вывод:

SELECT array FROM table LIMIT 1;
{{0,0,0},{1,1,1},{2,2,2},{3,3,3},{0,0,0},{1,1,1},{2,2,2},{3,3,3}
,{0,0,0},{1,1,1},{2,2,2},{3,3,3},{0,0,0},{1,1,1},{2,2,2},{3,3,3}
,{0,0,0},{1,1,1},{2,2,2},{3,3,3},{0,0,0},{1,1,1},{2,2,2},{3,3,3}}

И я хотел бы получить что-то более подобное:

{0,0,0}
{1,1,1}
{2,2,2}
...

Я могу сделать это после запросавозвращается с некоторым анализом, но если это возможно сделать в самом Postgres, это было бы идеально.

1 Ответ

5 голосов
/ 30 сентября 2011

Есть несколько способов. Один из способов - преобразовать массив в текст и разделить его с помощью regexp_split_to_table () .
Эта функция присутствует в PostgreSQL 8.3 или новее .

SELECT regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{');

Выход:

0,0,0
1,1,1
2,2,2

Если вы хотите заключить в скобки (может быть, нет?), Добавьте их обратно так:

SELECT '{' || regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{') || '}';

Ourtput:

{0,0,0}
{1,1,1}
{2,2,2}

Альтернатива:

Это также должно работать с PostgreSQL 8.2 или, может быть, даже раньше, но я не проверял это.

SELECT my_2d_int_arr_var[x:x][1:3]
  FROM (SELECT generate_series(1, array_upper(my_2d_intarr, 1), 1)::int4 AS x)) x

Вывод:

{{0,0,0}}
{{1,1,1}}
{{2,2,2}}

(Вы можете снять несколько фигурных скобок ..)

Иначе, я бы написал функцию plpgsql, которая перебирает массив. Довольно легко.

Существует также связанная функция unnest(), но она возвращает строку для каждого базового элемента (в данном случае целое число), поэтому здесь она бесполезна.

Один (быстрый!) Способ вывода результата: COPY.

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