Список значений строк через запятую - PullRequest
0 голосов
/ 29 ноября 2018

В настоящее время у меня есть база данных, структурированная примерно так:

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, чтобы создать временную таблицу, которая заменяет 1s на строковую переменную, напримеркак BirthDate, Drivers_License и SSN.Однако я не уверен, как я могу создать столбец списка.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я бы сделал что-то вроде:

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;
0 голосов
/ 29 ноября 2018

Вы можете сделать это с помощью гигантской 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() удаляет начальную запятую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...