我需要转换查询从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_name
或last_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;