我正在使用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。
答案 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中所做的事情:
这使您可以轻松完成此操作。
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;
工作得很好。