PostgreSQL 视图:将记录扁平化为列

发布于 2024-10-06 07:14:52 字数 304 浏览 2 评论 0原文

我想创建一个视图来显示有关系统用户的有趣内容。除此之外,我的数据库有一个表,每个用户有几行,基本上从 0 到 3 行不等。每个这样的行都有一个名为“name”的字符串字段,我希望我的视图包含所有这些以逗号分隔的内容。例如:

UID   Name    Concatenation
1     John    A, C
2     Jack    B, C
3     James   
4     Jill    B

有没有办法从其他表中选择到这一列?我正在使用 PostgreSQL,但这对我来说是一个通用的 SQL 问题。

I want to create a view that will display interesting stuff about the system users. Among other things, my DB has this table that has several rows per user, ranging basically from 0 to 3 rows. Each such row has a string field called "name", and I'd like my view to contain all of these comma-separated. For example:

UID   Name    Concatenation
1     John    A, C
2     Jack    B, C
3     James   
4     Jill    B

Is there a way to select from the other table into this column? I'm using PostgreSQL but this strikes me as a generic SQL question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

温柔少女心 2024-10-13 07:14:52

请参阅此处:

如何在 PostgreSQL 'group by' 查询中连接字符串字段的字符串?

您应该定义一个新的聚合函数。确切的函​​数取决于您的表结构,但这里有 来自 PostgreSQL 的示例forums

  CREATE AGGREGATE textcat_all(
      basetype    = text,
      sfunc       = textcat,
      stype       = text,
      initcond    = ''
  );

您可以在查询中使用这个新聚合。例如:

  SELECT partner.name, textcat_all(phones.number || ', ')
      FROM partner LEFT JOIN phones ON partner.id = phones.partner_id
      GROUP BY partner.name;

See here:

How to concatenate strings of a string field in a PostgreSQL 'group by' query?

You should define a new aggregate function. The exact function depends on your table structure, but here's an example from the PostgreSQL forums:

  CREATE AGGREGATE textcat_all(
      basetype    = text,
      sfunc       = textcat,
      stype       = text,
      initcond    = ''
  );

You can use this new aggregate in your query. For example:

  SELECT partner.name, textcat_all(phones.number || ', ')
      FROM partner LEFT JOIN phones ON partner.id = phones.partner_id
      GROUP BY partner.name;
残月升风 2024-10-13 07:14:52

例如,您可以使用某种字符串连接聚合:

create aggregate concat( basetype = text, 
                         sfunc = textcat, 
                         stype = text, 
                         initcond = '' );

select name, substring(concat(', '||value, 3) from t group by name;

但您需要 9.0 如果您想在聚合中使用 order by 子句

you can use some sort of string concatenation aggregate for example:

create aggregate concat( basetype = text, 
                         sfunc = textcat, 
                         stype = text, 
                         initcond = '' );

select name, substring(concat(', '||value, 3) from t group by name;

but you need 9.0 if you want to use an order by clause in the aggregate

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文