Вывести значения, разделенные двоеточиями, в postgres - PullRequest
0 голосов
/ 27 сентября 2011

Я использую Postgresql 8.1, и у меня нет новых функций в этой версии. Пожалуйста, помогите мне, что делать в этом случае?

Моя первая таблица выглядит следующим образом

таблица unit_office:

Mandal_ids       Name
82:05:          test sample
08:20:16:       test sample

Мандал Мастер стол:

mandal_id  mandal_name
08         Etcherla
16         Hiramandalam
20         Gara

Теперь, когда я говорю, выберите * из unit_office, он должен отобразить:

Mandal             Name of office
Hiramandalam, Gara   test sample

т.е. вместо идентификаторов я хочу, чтобы соответствующие имена (которые находятся в главной таблице) были разделены запятой

У меня есть столбец в postgres, у которого есть идентификаторы, разделенные двоеточиями. Ниже приведена одна запись из моей таблицы.

mandalid                
18:82:14:11:08:05:20:16:83:37:23:36:15:06:38:33:26:30:22:04:03:

Когда я говорю select * from table, в столбце mandalid должны отображаться имена мандалов в месте идентификатора, разделенные запятой.

Теперь у меня есть соответствующее имя для идентификатора в основной таблице.

Я хочу отобразить имена идентификаторов в запросе выбора первой таблицы. как

Мое первое имя таблицы - отделение офиса. когда я говорю, выберите * из офиса подразделения, я хочу, чтобы имена вместо идентификаторов.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Я предлагаю вам перепроектировать свои таблицы, но если вы не можете, то вам может потребоваться определить функцию, которая разбит строку mandal_ids на целые числа и отобразит их в имена.Я предлагаю вам прочитать PostgreSQL документацию по созданию функций .Язык "PL / pgSQL" может быть хорошим выбором.Вы можете использовать функции string_to_array и array_to_string.

Но если вы можете, я предлагаю вам определить ваши таблицы следующим образом:

mandals:
  id  name
   16  Hiramandalam
   20  Gara

unit_offices:
  id  name
   1   test sample

mandals_in_offices:
  office_id mandal_id
   1         16
   1         20

Вывод следующего запроса должен быть тем, что вам нужно:

  SELECT string_agg(m.name,',') AS mandal_names,
         max(o.name) AS office_name
      FROM mandals_in_offices i
        INNER JOIN unit_offices o ON i.office_id = o.id
        INNER JOIN mandals m ON i.mandal_id = m.id
      GROUP BY o.id;

Функция string_agg появилась в PostgreSQL версии 9, поэтому, если вы используете более старую версию, вам может потребоватьсянаписать аналогичную функцию самостоятельно.Я считаю, что это не будет слишком сложно.

0 голосов
/ 23 сентября 2012

Вот что мы сделали в LedgerSMB:

  1. создал функцию для выполнения конкатенации
  2. создал собственный агрегат для выполнения агрегации.

Это позволяет вам сделать это легко.

CREATE OR REPLACE FUNCTION concat_colon(TEXT, TEXT) returns TEXT as
$$
select CASE WHEN $1 IS NULL THEN $2 ELSE $1 || ':' || $2 END;
$$ language sql;

CREATE AGGREGATE concat_colon (
        BASETYPE = text,
        STYPE = text,
        SFUNC = concat_colon
);

Тогда вы можете:

select concat_colon(mycol::text) from mytable;

Работает просто отлично.

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