Snowflake如何仅获取表中包含值的列?
仅返回宽表中包含非空值的列的方法
针对不同数据库,这里提供几种实用方法,帮你快速筛选出有值的列并查询:
MySQL/MariaDB
步骤1:获取非空列列表
SELECT GROUP_CONCAT(column_name SEPARATOR ', ') FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = '你的表名' AND (SELECT COUNT(*) FROM `你的表名` WHERE `column_name` IS NOT NULL) > 0;
步骤2:用结果查询数据
把上面返回的列名直接放到SELECT语句里,比如:SELECT col1, col2, col3 FROM 你的表名;
一次性动态查询(更高效)
不想手动复制列名的话,用动态SQL直接返回结果:
SET @sql = NULL; SELECT GROUP_CONCAT(column_name) INTO @sql FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = '你的表名' AND (SELECT COUNT(*) FROM `你的表名` WHERE `column_name` IS NOT NULL) > 0; SET @sql = CONCAT('SELECT ', @sql, ' FROM `你的表名`;'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PostgreSQL
获取非空列列表
SELECT string_agg(column_name, ', ') FROM information_schema.columns WHERE table_schema = 'public' -- 按需替换成你的schema AND table_name = '你的表名' AND EXISTS (SELECT 1 FROM "你的表名" WHERE "column_name" IS NOT NULL);
拿到列名后直接写SELECT语句查询,或者用动态SQL:
DO $$ DECLARE cols TEXT; BEGIN SELECT string_agg(column_name, ', ') INTO cols FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '你的表名' AND EXISTS (SELECT 1 FROM "你的表名" WHERE "column_name" IS NOT NULL); EXECUTE 'SELECT ' || cols || ' FROM "你的表名";'; END $$;
SQL Server
获取非空列列表
SELECT STRING_AGG(column_name, ', ') FROM information_schema.columns WHERE table_catalog = '你的数据库名' AND table_schema = 'dbo' -- 替换成你的schema AND table_name = '你的表名' AND EXISTS (SELECT 1 FROM [你的表名] WHERE [column_name] IS NOT NULL);
动态SQL版本:
DECLARE @cols NVARCHAR(MAX); SELECT @cols = STRING_AGG(column_name, ', ') FROM information_schema.columns WHERE table_catalog = '你的数据库名' AND table_schema = 'dbo' AND table_name = '你的表名' AND EXISTS (SELECT 1 FROM [你的表名] WHERE [column_name] IS NOT NULL); EXEC('SELECT ' + @cols + ' FROM [你的表名];');
注意:替换代码里的你的数据库名、你的表名、schema为实际值,避免语法错误。
内容的提问来源于stack exchange,提问作者Ee Ann Ng
相关产品推荐
相关产品推荐

