我有4个国家专栏,跟踪在特定地区的书籍。例如,EN='Y',GE='N',等等。我正在创建一个视图,并希望在“可用国家”列中添加每个记录。因此,如果EN='Y‘和GE='Y’,它会把它们列为'en,ge‘在可用的国家。到目前为止,我得到的是:
case
when EN = 'Y' and GE = 'Y'
then 'EN, GE'
when EN = 'N' and GE = 'Y'
then 'GE'
end as 'available country'
这是可行的,但我有4多列,可能会添加更多,定义每个条件感觉不够。
是否有更好的方法来连接值而不是指定每个条件?
发布于 2021-06-16 06:05:58
您可以将CONCAT_WS
与CASE
表达式一起使用:
SELECT CONCAT_WS(',', CASE WHEN EN = 'Y' THEN 'EN' END,
CASE WHEN GE = 'Y' THEN 'GE' END,
...) AS "available country"
FROM yourTable;
但是一个更好的桌子设计应该是这样的:
id | language | val
1 | EN | Y
1 | GE | N
使用此设计,您可以简单地通过id
进行聚合,并只对那些具有yes值的语言进行筛选,例如:
SELECT id, ARRAY_AGG(language)
FROM yourTable
WHERE val = 'Y'
GROUP BY id;
发布于 2021-06-16 06:07:49
您可以将列转换为行(首先它们应该是什么),然后使用string_agg()
获得逗号分隔的列表:
select t.id, f.*
from the_table t
cross join lateral (
select string_agg(colname, ',') as available_countries
from (
values (en, 'EN'),
(ge, 'GE'),
(de, 'DE'),
(fr, 'FR')
) x(flag, colname)
where flag = 'Y'
) as f
发布于 2021-06-16 06:27:48
不幸的是,我认为当您使用当前数据库设计时,您将不得不使用CASE。请检查一下这个是否适合你。
select TRIM(BOTH ',' FROM c1_new||c2_new||c3_new||c4_new) as concat_col
from
(
select case when c1 = 'Y' then 'C1,' else null end as c1_new,
case when c2 = 'Y' then 'C2,' else null end as c2_new,
case when c3 = 'Y' then 'C3,' else null end as c3_new,
case when c4 = 'Y' then 'C4' else null end as c4_new
from TABLE
)
https://stackoverflow.com/questions/67997137
复制相似问题