PostgreSQL - 如何 select 来自游标的元素在一行中
PostgreSQL - how to select elements from a cursor in a single row
我需要将查询从 Oracle SQL 转换为 Postgres。查询 returns 来自游标的单行元素。我将在 Oracle 中编写此查询的简化形式:
select CONCAT_LIST( cursor( select first_name || '-' || last_name from sys_users) ,',') as users_list from dual
如果 table "sys_users" 有 2 个元素:
1. first name - "John", last name - "Smith"
2. first name - "George", last name - "Doe" ,
结果是:
John-Smith,George-Doe
如果此 table 中的元素相同,我需要在 Postgres 中获得相同的结果。
要聚合字符串,请使用 string_agg()
select string_agg(first_name || '-' || last_name, ',') as users_list
from sys_users;
请注意,如果 first_name
或 last_name
可以为空,则串联的结果也将为空(与 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;
顺便说一句:您的 Oracle 查询过于复杂,如果将 string_agg()
替换为 listagg()
,您基本上可以使用与第一个 Postgres 查询相同的查询
select listagg(firstname||'-'||lastname, ',') within group (order by lastname)
from sys_users;
我需要将查询从 Oracle SQL 转换为 Postgres。查询 returns 来自游标的单行元素。我将在 Oracle 中编写此查询的简化形式:
select CONCAT_LIST( cursor( select first_name || '-' || last_name from sys_users) ,',') as users_list from dual
如果 table "sys_users" 有 2 个元素:
1. first name - "John", last name - "Smith"
2. first name - "George", last name - "Doe" ,
结果是:
John-Smith,George-Doe
如果此 table 中的元素相同,我需要在 Postgres 中获得相同的结果。
要聚合字符串,请使用 string_agg()
select string_agg(first_name || '-' || last_name, ',') as users_list
from sys_users;
请注意,如果 first_name
或 last_name
可以为空,则串联的结果也将为空(与 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;
顺便说一句:您的 Oracle 查询过于复杂,如果将 string_agg()
替换为 listagg()
select listagg(firstname||'-'||lastname, ',') within group (order by lastname)
from sys_users;