【问题标题】:PostgreSQL - how to select elements from a cursor in a single rowPostgreSQL - 如何从单行中的游标中选择元素
【发布时间】:2015-09-01 10:50:33
【问题描述】:

我需要将查询从 Oracle SQL 转换为 Postgres。查询从游标返回单行元素。我将在 Oracle 中编写此查询的简化形式:

select CONCAT_LIST( cursor( select first_name || '-' || last_name from sys_users)  ,',') as users_list from dual

如果表“sys_users”有 2 个元素:

1. first name - "John", last name - "Smith"
2. first name - "George", last name - "Doe" ,

结果是:

John-Smith,George-Doe

如果此表中的元素相同,我需要在 Postgres 中得到相同的结果。

【问题讨论】:

    标签: sql oracle postgresql string-aggregation


    【解决方案1】:

    要聚合字符串,请使用string_agg()

    select string_agg(first_name || '-' || last_name, ',') as users_list
    from sys_users;
    

    请注意,如果first_namelast_name 可以为null,则连接的结果也将为null(与Oracle 不同)。要解决这个问题,请改用concat(),它只是将 NULL 视为空字符串:

    select string_agg(concat(first_name, '-', last_name), ',') as users_list
    from sys_users;
    

    甚至更好:使用concat_ws(),如果元素为NULL,则将省略'-'

    select string_agg(concat_ws('-', first_name, last_name), ',') as users_list
    from sys_users;
    

    顺便说一句:您的 Oracle 查询过于复杂,如果您将 string_agg() 替换为 listagg(),则基本上可以使用与第一个 Postgres 查询相同的查询

    select listagg(firstname||'-'||lastname, ',') within group (order by lastname)
    from sys_users;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-04
      • 2022-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多