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



我需要转换查询从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中得到相同的结果,如果这个表中的元素是相同的

要聚合字符串,使用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;

Btw:你的Oracle查询过于复杂,你基本上可以使用相同的第一个Postgres查询,如果你替换string_agg()listagg()

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

最新更新