1

我需要将查询从 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 中获得相同的结果。

4

1 回答 1

2

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

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

请注意,如果first_nameorlast_name可以为 null,则连接的结果也将为 null(与 Oracle 不同)。为了解决这个问题,请使用concat()简单地将 NULL 视为空字符串的方法:

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

甚至更好:使用concat_ws()which 将忽略'-'元素是否为 NULL:

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

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

select listagg(firstname||'-'||lastname, ',') within group (order by lastname)
from sys_users;
于 2015-09-01T10:54:07.667 回答