在postgres中显示冒号分隔值

时间:2011-09-27 09:51:42

标签: postgresql

我正在使用postgresql 8.1,我在该版本中没有新功能。请帮助我在这种情况下做什么?

我的第一张表如下

unit_office表:

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

Mandal Master table:

mandal_id  mandal_name
08         Etcherla
16         Hiramandalam
20         Gara

现在,当我说来自unit_office的select *时,它应显示:

Mandal             Name of office
Hiramandalam, Gara   test sample

,即代替id,我想要用逗号

分隔的相应名称(在主表中)

我在postgres中有一个列,它有冒号分隔的id。以下是我桌上的一条记录。

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列应显示以逗号分隔的id位置的mandals名称。

现在我在主表中有相应的id名称。

我想在第一个表的select查询中显示id的名称。像

我的第一个表名是单位办公室。当我说从单位办公室选择*时,我想要名字代替ids。

2 个答案:

答案 0 :(得分:1)

我建议您重新设计表格,但如果不能,那么您可能需要定义一个函数,它将mandal_ids字符串拆分为整数,并将它们映射到名称。我建议你阅读PostgreSQL documentation on creating functions。 “PL / pgSQL”语言可能是一个不错的选择。您可以使用string_to_array and 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中,因此如果您使用的是旧版本,则可能需要自己编写类似的函数。我相信这不会太难。

答案 1 :(得分:0)

以下是我们在LedgerSMB中所做的事情:

  1. 创建了一个连接功能
  2. 创建了一个自定义聚合来进行聚合。
  3. 这使您可以轻松完成此操作。

    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;
    

    工作得很好。