2013-10-18 62 views
0

我有兩個表,表A具有ID列,它們的值用逗號分隔,每個這些ID值的具有表B.表示與另一個在選擇查詢替換表逗號單獨值(postgres的)

Table A 
+-----------------+ 
| Name  | ID | 
+------------------ 
| A1  | 1,2,3| 
| A2  | 2 | 
| A3  | 3,2 | 
+------------------ 

    Table B 
+-------------------+ 
| ID  | Value | 
+-------------------+ 
| 1  | Apple | 
| 2  | Orange | 
| 3  | Mango | 
+-------------------+ 

我想知道是否有做一個選擇一種有效的方式,其中結果將如下,

Name, Value 
    A1 Apple, Orange, Mango 
    A2 Orange 
    A3 Mango, Orange 

Any suggestions would be welcome. Thanks. 

回答

1

您需要首先「正常化」 table_a到一個新表使用下列內容:

select name, regexp_split_to_table(id, ',') id 
from table_a; 

這樣做的結果可以加入到table_b和需要進行分組的加入,那麼結果爲了獲得逗號分隔的名字列表:

select a.name, string_agg(b.value, ',') 
from (
    select name, regexp_split_to_table(id, ',') id 
    from table_a 
) a 
    JOIN table_b b on b.id = a.id 
group by a.name; 

SQLFiddle:http://sqlfiddle.com/#!12/77fdf/1

+0

感謝您的回覆,我正在按照建議正常化,並使用連接將其歸爲一組。 –

0

有兩個正則表達式相關的功能可以是有用的:

http://www.postgresql.org/docs/current/static/functions-string.html

  • regexp_split_to_table()
  • regexp_split_to_array()

下面的代碼是未經測試,但你會使用類似的東西,以配合A和B:

select name, value 
from A 
join B on B.id = ANY(regexp_split_to_array(A.id, E'\\s*,\\s*', 'g')::int[])) 

你然後可以使用array_agg(value),按名稱進行分組,並使用array_to_string()進行格式化。

兩點需要注意,雖然:

  1. 這不會是正火的事情一樣高效。
  2. 格式化本身應該在您的視圖中進一步完成。
+0

感謝您的回覆。 –

相關問題