Sql 查询值为null的单行的列名?
我试图返回值为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 是否有一个函数或简单的方法来实现这一点的相反,返回所有具有空值的键(列名)?您需要一个主键或唯一列。在示例中,
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;