Postgresql 用select查询(postgres)中的另一个值替换表中的逗号分隔值

Postgresql 用select查询(postgres)中的另一个值替换表中的逗号分隔值,postgresql,Postgresql,我有两个表,表A有ID列,其值用逗号分隔,每个ID值在表B中都有表示 Table A +-----------------+ | Name | ID | +------------------ | A1 | 1,2,3| | A2 | 2 | | A3 | 3,2 | +------------------ Table B +-------------------+ | ID | Value | +---

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

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

  • regexp_拆分为_表()
  • regexp_拆分为_数组()
下面的代码未经测试,但您可以使用类似的代码来匹配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()格式化

但有两点需要注意:

  • 它不会像正常化一样有效
  • 在您的视图中,格式化本身应该做得更深入一些
  • 您需要首先使用以下命令将表a“规范化”为新表:

    select name, regexp_split_to_table(id, ',')  id
    from table_a;
    
    此操作的结果可以连接到
    表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:

    感谢您的回复,我正在按照建议进行规范化,并使用连接将其重新分组。