PostgreSQL查询:仅选择包含至少一个非空值的列
如何在PostgreSQL中仅查询包含非空值的列(排除全空列)
我有一个PostgreSQL数据库,部分列未填充数据,需要仅查询那些至少包含一个非空值的列——整列从上到下全为空的列不被选中。此前找到的方案都是按行筛选,会排除存在空列的整行,不符合需求。
示例表
╔═══════════════╦════════════╦══════════════╦════════════╦═════════════╦════════════════╦════════════════╗ ║ "receiver_id" ║ "gps_week" ║ "gps_second" ║ "latitude" ║ "longitude" ║ "altitude_msl" ║ "altitude_hae" ║ ╠═══════════════╬════════════╬══════════════╬════════════╬═════════════╬════════════════╬════════════════╣ ║ 1 ║ ║ ║ 38.0517465 ║ 15.660851 ║ ║ 691.379883 ║ ║ 1 ║ ║ ║ 38.0517465 ║ 15.660851 ║ ║ 691.389404 ║ ║ 1 ║ ║ ║ 38.0517465 ║ 15.660851 ║ ║ 691.402344 ║ ║ 1 ║ ║ ║ 38.0517465 ║ 15.6608509 ║ ║ 691.413818 ║ ║ 1 ║ ║ ║ 38.0517465 ║ 15.6608508 ║ ║ 691.425659 ║ ╚═══════════════╩════════════╩══════════════╩════════════╩═════════════╩════════════════╩════════════════╝
期望返回的列
receiver_id, latitude, longitude, altitude_hae
解决方案
方法1:动态生成查询语句(通用方案)
利用PostgreSQL系统表自动识别非空列并生成可执行的查询语句,适合列数较多的表:
SELECT 'SELECT ' || string_agg(column_name, ', ') || ' FROM your_table;' AS dynamic_query FROM information_schema.columns WHERE table_schema = 'public' -- 替换为你的表所在的schema AND table_name = 'your_table' -- 替换为你的表名 AND EXISTS ( SELECT 1 FROM your_table WHERE (your_table).column_name IS NOT NULL );
执行上述SQL后,会直接得到一条可运行的SELECT语句,针对示例表生成的语句为:
SELECT receiver_id, latitude, longitude, altitude_hae FROM your_table;
方法2:手动验证后编写查询(适合小表)
如果表的列数较少,可逐个验证列是否存在非空值:
-- 验证单列是否有非空值 SELECT EXISTS(SELECT 1 FROM your_table WHERE gps_week IS NOT NULL);
保留所有返回true的列,手动编写对应的SELECT语句即可。
内容的提问来源于stack exchange,提问作者Tom Stober
相关产品推荐
相关产品推荐

