sql,使用 CASE 时过滤掉空列

sql, filiter out null columns when using CASE

我正在将布尔值转换为文本,如下所示:

select 
    CASE WHEN admin IS true THEN 'Admin' END,
    CASE WHEN co IS true THEN 'CO' END,
    CASE WHEN corp IS true THEN 'CORP' END, 
    CASE WHEN grind IS true THEN 'grind' END, 
    CASE WHEN vendor IS true THEN 'Vendor' END, 
    CASE WHEN gpm IS true THEN 'GPM' END
from user_profiles where user_name = 'don.smith@happy.com'; 

不幸的是,这个 returns 为空值。我怎样才能 return 只取回有文本的字段?

您不能查询 return 不同行的动态列数。所以如果你想删除 NULL 你能做的最好的就是将 ELSE 子句添加到 return 空字符串 '' 否则默认 return 为 ELSE 将是 NULL

而且您还应该考虑为每个字段名称包含一个别名

select 
    CASE WHEN admin IS true THEN 'Admin' ELSE '' END,
    CASE WHEN co IS true THEN 'CO' ELSE '' END,
    CASE WHEN corp IS true THEN 'CORP' ELSE '' END, 
    CASE WHEN grind IS true THEN 'grind' ELSE '' END, 
    CASE WHEN vendor IS true THEN 'Vendor' ELSE '' END, 
    CASE WHEN gpm IS true THEN 'GPM' ELSE '' END
from user_profiles 
where user_name = 'don.smith@happy.com'; 

如果您想 return 将其作为单个分隔列,则一种方法是 concat_ws():

select concat_ws(',',
                 CASE WHEN admin IS true THEN 'Admin' END,
                 CASE WHEN co IS true THEN 'CO' END,
                 CASE WHEN corp IS true THEN 'CORP' END, 
                 CASE WHEN grind IS true THEN 'grind' END, 
                 CASE WHEN vendor IS true THEN 'Vendor' END, 
                 CASE WHEN gpm IS true THEN 'GPM' END
                )
from user_profiles
where user_name = 'don.smith@happy.com'; 

这 return 将值作为单个列:单个查询不能有可变数量的列,因此单个列似乎是最好的选择。