Выбор всех столбцов с НЕНУЛЕВЫМИ значениями для данной строки в PostgreSQL

#sql #postgresql

Вопрос:

У меня есть таблица со столбцами id, A, B, C, D. Каждая строка имеет уникальные НЕНУЛЕВЫЕ значения столбцов A, B, C, D: для строки с идентификатором=1 это: A,C,D; для строки с идентификатором = 2 это: B,C и так далее. Мне нужна помощь в написании SQL-скрипта, который вернет список столбцов с НЕНУЛЕВЫМИ значениями для каждой заданной строки. Что-то вроде:

 SELECT NOT_NULL_Columns FROM table WHERE id=1;
 

Ожидаемый результат-таблица только с одной строкой, именами столбцов и соответствующими (не нулевыми) значениями

Комментарии:

1. вам нужны только имена столбцов или фактические значения?

2. На самом деле они оба. Ожидаемый результат-таблица только с одной строкой, именами столбцов и соответствующими значениями

Ответ №1:

SQL-запрос не может возвращать переменное количество столбцов, поэтому я предполагаю, что вам нужны имена столбцов, которые имеют ненулевые значения.

Вы можете сделать:

 select *,
  case when a is not null then 'A ' else '' end ||
  case when b is not null then 'B ' else '' end ||
  case when c is not null then 'C ' else '' end ||
  case when d is not null then 'D ' else '' end as not_null_columns
from t
 

Результат:

  id  a     b     c  d     not_null_columns 
 --- ----- ----- -- ----- ---------------- 
 1   7     null  7  7     A C D            
 2   null  7     7  null  B C              
 3   null  7     7  7     B C D            
 

См.Пример выполнения в DB Fiddle.

Теперь, если бы вы хотели ненулевые значения, это была бы другая история. Поскольку SQL не может создавать переменное количество столбцов, решение может пойти в направлении сборки всех ненулевых значений в структуру, такую как массив, XML-документ, документ JSON или даже строка.

Ответ №2:

Вы можете преобразовать строку в значение JSON и удалить все ключи (=столбцы) с нулевыми значениями:

 select jsonb_strip_nulls(to_jsonb(t) - 'id')
from the_table t
where id = 1;