以逗号分隔的行值列表

时间:2018-11-28 21:31:53

标签: sql crystal-reports db2

我目前有一个类似于以下结构的数据库:

Name | v_BirthDate | v_Drivers_License | v_SSN 
-----------------------------------------------
Anna |      1      |         0         |   1
Bob  |      0      |         1         |   0
Cal  |      1      |         1         |   1 
Dave |      0      |         0         |   1

数据库的基本思想是查看如何在系统中验证人员;该人是否已使用其出生日期,驾照号码或社交身份在系统中得到验证。

我想做的是为每个人排一行,并创建另一列,以逗号分隔的格式显示已用验证方法的列表。

类似的东西:

Name | v_BirthDate | v_Drivers_License | v_SSN |    list 
-----------------------------------------------------------
Anna |      1      |         0         |   1   | BirthDate,SSN
Bob  |      0      |         1         |   0   | Drivers_License
Cal  |      1      |         1         |   1   | BirthDate,Drivers_License,SSN
Dave |      0      |         0         |   1   | SSN

我使用WITH子句创建了一个临时表,该表将1更改为字符串变量,例如BirthDate,Drivers_License和SSN。但是,我不确定如何创建列表列。预先谢谢你。

2 个答案:

答案 0 :(得分:0)

您可以使用巨型case和一些字符串逻辑来完成此操作:

select t.*,
       trim(leading ',' from
            (case when v_BirthDate = 1 then ',BirthDate' else '' end) ||
            (case when v_Drivers_License = 1 then ',Drivers_License' else '' end) ||
            (case when v_SSN = 1 then ',v_SSN' else '' end)
           ) as list
from t;

这将创建一个字符串,该字符串由每个组件组成,后跟一个逗号。 trim()删除了逗号。

答案 1 :(得分:0)

我会做类似的事情:

with x as (
  select
      name, v_birthdate, v_drivers_license, v_ssn,
      case when v_birthdate = 1 then ',BirthDate' else '' end ||
      case when v_drivers_license = 1 then ',Drivers_License' else '' end ||
      case when v_ssn = 1 then ',SSN' else '' end as list
    from my_table
)
select 
    name, v_birthdate, v_drivers_license, v_ssn,
    case when list = '' then list else substr(list, 2) end as list
  from x;