PostgreSQL - 如何从一行中的游标中选择元素
问题描述:
我需要将查询从Oracle SQL转换为Postgres。查询从游标返回单行元素。我会写这个查询的简化形式甲骨文:PostgreSQL - 如何从一行中的游标中选择元素
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
可以为空,拼接的结果也将是空的(不像甲骨文)。要解决这个问题,使用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查询过于复杂,如果你用string_agg()
替换为listagg()
select listagg(firstname||'-'||lastname, ',') within group (order by lastname)
from sys_users;