PostgreSQL - 如何从单行中的游标中选择元素

时间:2015-09-01 10:50:33

标签: sql oracle postgresql string-aggregation

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

@Override
public Object invoke(Object proxy, Method method, Object[] args) {
    if (method.isAnnotationPresent(IDCheck.class)) {
        //proceed with navigation and throw exception if invalid
    }

    // delegate the method execution to a wrapped implementor of the MyInterface
}

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

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

结果是:

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

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

1 个答案:

答案 0 :(得分:2)

要汇总字符串,请使用string_agg()

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

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

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;