запросить имена столбцов для одной строки, где значение равно нулю? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь вернуть все имена столбцов для одной строки, где значение равно нулю. Я могу проанализировать всю строку позже, но мне интересно, есть ли функция, которую я могу использовать.

Я могу вернуть объект JSON, содержащий пары ключ-значение, где значение равно , а не ноль, используя row_to_json() и json_strip_nulls, где условные ссылки на одну уникальную строку:

SELECT json_strip_nulls(row_to_json(t))
   FROM table t where t.id = 123

Есть ли функция или простой способ сделать обратное, возвращая все ключи (имена столбцов) с нулевыми значениями?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

На самом деле подход JSON может работать. Сначала преобразуйте строки в объект JSON с помощью row_ro_json(). Затем разверните объекты JSON до набора, используя json_each_text(). Теперь вы можете фильтровать значения NULL и использовать агрегацию для получения столбцов, содержащих NULL.

Я не знаю, какой выходной формат вы хотите. json_object_agg() является «дополнением» к вашему подходу json_strip_nulls() / row_to_json(). Но вам также может понадобиться массив JSON (json_agg), просто массив (array_agg()) или список строк через запятую (string_agg()).

SELECT json_object_agg(jet.k, jet.v),
       json_agg(jet.k),
       array_agg(jet.k),
       string_agg(jet.k, ',')
       FROM elbat t
            CROSS JOIN LATERAL row_to_json(t) rtj(j)
            CROSS JOIN LATERAL json_each_text(rtj.j) jet(k, v)
       WHERE jet.v IS NULL
       GROUP BY rtj.j::text;

дб <> скрипка

0 голосов
/ 09 января 2019

Вам нужен первичный ключ или уникальный столбец (столбцы). В примере id уникален:

with my_table(id, col1, col2, col3) as (
values
    (1, 'a', 'b', 'c'),
    (2, 'a', null, null),
    (3, null, 'b', 'c')
)

select id, array_agg(key) as null_columns
from my_table t
cross join jsonb_each_text(to_jsonb(t))
where value is null
group by id

 id | null_columns 
----+--------------
  2 | {col2,col3}
  3 | {col1}
(2 rows)    

key и value - это столбцы по умолчанию, возвращаемые функцией jsonb_each_text(). См. Функции и операторы JSON в документации.

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