2011-09-27 171 views
-1

我使用的是postgresql 8.1,我没有该版本中的新功能。请帮我在这种情况下做什么?在postgres中显示冒号分隔值

我的第一个表如下

unit_office表:

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

曼达尔主表:

mandal_id mandal_name 
08   Etcherla 
16   Hiramandalam 
20   Gara 

现在,当我说SELECT * FROM unit_office它应该显示:

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表中,列mandalid应显示在用逗号分隔的ID的地方mandals的名称。

现在我有一个主表中的ID相应的名称。

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

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

+0

我的示例数据中没有看到逗号(',')。你是不是冒号(':')?请向我们展示所涉及的两张桌子的定义! –

+0

我的第一个表是unit_office,如下创建表unit_office(mandal_id,office_name),我有mandal_id列如下08:20:16:。现在,当我说select * from unit_office时,我想要的名称是id在mandal_master下面为08-hyderabad,20 - nizampet等 – verve

+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中,所以如果你使用的是旧版本,你可能需要自己编写类似的函数。我相信这不会太难。

0

下面是我们在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; 

作品就好了。