PostgreSQL未知表字段时替换NULL为空串并转字符串方法
处理未知字段表的NULL替换与字符串转换
因为你不清楚表的字段名,无法逐个指定处理逻辑,得借助数据库的系统元数据来动态生成目标查询语句,以下是主流数据库的实现方案:
MySQL/MariaDB
通过INFORMATION_SCHEMA.COLUMNS获取表的所有字段,拼接出带处理逻辑的SQL:
SELECT CONCAT( 'SELECT ', GROUP_CONCAT( CONCAT('IFNULL(CAST(`', COLUMN_NAME, '` AS CHAR), '''') SEPARATOR ', ' ), ' FROM ', TABLE_NAME, ';' ) AS dynamic_query FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() -- 自动取当前连接的数据库 AND TABLE_NAME = '<TABLE_NAME>'; -- 替换成你的表名
执行这条语句会生成一条完整的查询语句,复制生成的结果再执行,就能得到所有字段转字符串、NULL替换为空的结果。
PostgreSQL
用COALESCE处理NULL,TEXT类型做字符串转换,系统元数据表同样用information_schema.columns:
SELECT CONCAT( 'SELECT ', STRING_AGG( CONCAT('COALESCE(CAST("', column_name, '" AS TEXT), '''')', ', ' ), ' FROM ', table_name, ';' ) AS dynamic_query FROM information_schema.columns WHERE table_schema = current_schema() AND table_name = '<TABLE_NAME>';
生成SQL后复制执行即可,逻辑和MySQL一致。
SQL Server
使用ISNULL替换NULL,VARCHAR(MAX)做通用字符串转换,系统视图用INFORMATION_SCHEMA.COLUMNS:
SELECT CONCAT( 'SELECT ', STRING_AGG( CONCAT('ISNULL(CAST(', QUOTENAME(column_name), ' AS VARCHAR(MAX)), '''')', ', ' ), ' FROM ', QUOTENAME(table_name), ';' ) AS dynamic_query FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = SCHEMA_NAME() AND TABLE_NAME = '<TABLE_NAME>';
注意:SQL Server 2017及以上版本支持STRING_AGG,如果是更早版本,需要用FOR XML PATH的方式拼接字段列表。
额外提示
- 这种动态生成SQL的方式,不用手动枚举所有字段,适合临时查询场景
- 不同数据库的字符串类型略有差异,比如MySQL用
CHAR、PostgreSQL用TEXT、SQL Server用VARCHAR,可根据实际需求调整转换后的类型 - 如果需要保留原字段名,可在拼接时加上别名,比如
CONCAT('IFNULL(CAST(', COLUMN_NAME, 'AS CHAR), '''') AS ', COLUMN_NAME)
内容的提问来源于stack exchange,提问作者Mark Smith
相关产品推荐
相关产品推荐

