Sql 查询值为null的单行的列名?

Sql 查询值为null的单行的列名?,sql,postgresql,columnname,Sql,Postgresql,Columnname,我试图返回值为null的单行的所有列名。我可以在之后解析整行,但我很好奇是否有一个函数可以利用 我可以使用row\u to\u JSON()和JSON\u strip\u nulls返回包含键值对的JSON对象,其中,条件引用一个唯一的行: SELECT json_strip_nulls(row_to_json(t)) FROM table t where t.id = 123 是否有一个函数或简单的方法来实现这一点的相反,返回所有具有空值的键(列名)?您需要一个主键或唯一列。在示例中,

我试图返回值为null的单行的所有列名。我可以在之后解析整行,但我很好奇是否有一个函数可以利用

我可以使用
row\u to\u JSON()
JSON\u strip\u nulls
返回包含键值对的JSON对象,其中,条件引用一个唯一的行:

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

是否有一个函数或简单的方法来实现这一点的相反,返回所有具有空值的键(列名)?

您需要一个主键或唯一列。在示例中,
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\u each\u text()返回的默认列。
请参见文档中的内容。

实际上,JSON方法可能会起作用。首先使用
row\u ro\u JSON()
将行转换为JSON对象。然后使用
JSON\u each\u text()
将JSON对象展开回一个集合。您现在可以筛选
NULL
值,并使用聚合来获取包含
NULL
的列

我不知道你想要什么输出格式
json\u object\u agg()
json\u strip\u nulls()方法的“补充”。但您可能还需要一个JSON数组(
JSON\u agg
),一个数组(
array\u agg()
)或逗号分隔的字符串列表(
string\u 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;