0

私は2つのテーブルを持っています.テーブルAには値がコンマで区切られたID列があり、それらのID値はそれぞれテーブルBに表現されています.

   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.
4

2 に答える 2

2

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

于 2013-10-18T13:54:19.280 に答える
0

便利な正規表現関連の関数が 2 つあります。

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() を使用したフォーマットを使用できます。

ただし、次の 2 つの注意事項があります。

  1. 物事を正規化するほど効率的ではありません。
  2. 書式設定自体は、ビューのさらに下で行う必要があります。
于 2013-10-18T13:27:06.060 に答える