0

我有两个表,表 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

有两个与正则表达式相关的函数很有用:

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. 在您看来,格式本身应该进一步向下完成。
于 2013-10-18T13:27:06.060 回答