为包含列表的单元格返回多行

时间:2011-12-13 15:08:37

标签: sql postgresql plpgsql

我在postgres db中有这样的东西:

| foo | 1,2 | a,b |

我想将其扩展为:

| foo | 1 | a |
| foo | 2 | b |

我知道我可以用plpgsql做到这一点,但想知道是否有办法用sql。

提前致谢

2 个答案:

答案 0 :(得分:0)

您是否希望列表项之间存在一对一的关系,假设每行中有多个列表,或者项目之间是否存在某种关系,那么您始终希望A绑定为1且b绑定为2?

从单个直接的sql语句,不是真的。我认为你必须使用存储过程并循环遍历表。如果它正在输入应用程序,您可以在一个sql语句中获取所有内容,然后使用您的代码循环遍历它并从每行中分出列表。

答案 1 :(得分:0)

考虑一下这个演示:

SELECT name
      ,unnest(a)
      ,unnest(b)
FROM  (VALUES ('foo', '{1,2}'::int[], '{a,b}'::text[])) t(name, a, b)

结果:

 name | unnest | unnest
------+--------+--------
 foo  |      1 | a
 foo  |      2 | b
(2 rows)

或者,如果您使用逗号分隔的字符串而不是ARRAY:

SELECT name
      ,regexp_split_to_table(a, ',')
      ,regexp_split_to_table(b, ',')
FROM  (VALUES ('foo', '1,2'::text, 'a,b'::text)) t(name, a, b)

相同的结果。
有关手册中unnest()regexp_split_to_table()的更多信息。