PGSQL在某些条件下选择列

时间:2018-08-20 14:53:40

标签: postgresql

在一个表中,我有5列day1,day2 ... day5。表中的记录可以将所有日期设置为TRUE,也可以将几天设置为TRUE。 PGSQL中有什么方法可以只选择记录中布尔值为TRUE的那些列?

示例: 我的表是:课程,列为课程名称,第1天,第2天,第3天,第4天,第5天,记录设置为

English,True,False,True,False,True
German,False,False,True,True,True
French,False,True,False,True,True

我需要显示为结果集的是:

English,Mon,Wed,Fri
German,Wed,Thu,Fri
French,Tue,Thu,Fri

2 个答案:

答案 0 :(得分:1)

我相信类似以下内容的工作应该可以完成。这有点丑陋,因为您的架构不是最出色的。这应该适用于Postgres 9 +

SELECT course, string_agg(day, ',') as days_of_week
FROM
    (
        SELECT course, 'Mon' as day FROM yourtable WHERE day1 = 'True'
        UNION ALL
        SELECT course, 'Tue' as day FROM yourtable WHERE day2 = 'True'
        UNION ALL
        SELECT course, 'Wed' as day FROM yourtable WHERE day3 = 'True'
        UNION ALL
        SELECT course, 'Thu' as day FROM yourtable WHERE day4 = 'True'
        UNION ALL
        SELECT course, 'Fri' as day FROM yourtable WHERE day5 = 'True'
    ) sub

答案 1 :(得分:0)

iif之类的功能突然丢失了,但是您可以简单地创建它:

var output core.ApiData

然后:

create or replace function iif(boolean, anyelement, anyelement = null) returns anyelement
  language sql
  immutable
as $$
  select case when $1 is null then null when $1 then $2 else $3 end
$$;