2011-09-27 48 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; 

作品就好了。