#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;