SQL实现检查表列是否存在并将对应列数据存入新列RecProdOwner
跨库同语义不同名列统一查询实现方案
问题背景
合并两套部署在不同数据库服务器的规则时,已完成文件合并,但两库的APE表存在名称不同、存储数据完全一致的两个列:APE.RecProdOwner与APE.ReconciliationOwner。需要实现逻辑:检查当前库中两个列的存在状态,只要任意一个列存在,就将该列数据映射到统一命名为RecProdOwner的新列中。
实现思路
静态SQL直接写入两个列名会在缺失对应列的库中抛出「字段不存在」的报错,因此必须通过动态SQL先做列存在性校验,再根据实际表结构拼接查询语句:
- 读取数据库元数据,判断
APE表下两个目标列的存在情况 - 按照列存在状态拼接SELECT子句,将存在的目标列取统一别名
RecProdOwner - 两个列均不存在时,返回NULL作为
RecProdOwner的值避免语句报错 - 执行拼接完成的动态SQL返回结果
代码示例
SQL Server 版本
DECLARE @querySql NVARCHAR(MAX); -- 拼接查询语句,固定查询的其他列可直接写在SELECT子句对应位置 SELECT @querySql = N'SELECT -- 此处填写其他固定需要查询的列,例如:ID, CreateTime, OrderNo ' + CASE -- 优先匹配原生RecProdOwner列 WHEN EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'APE') AND name = N'RecProdOwner') THEN N'RecProdOwner AS RecProdOwner' -- 次选匹配ReconciliationOwner列 WHEN EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'APE') AND name = N'ReconciliationOwner') THEN N'ReconciliationOwner AS RecProdOwner' -- 两列都不存在时返回空值 ELSE N'NULL AS RecProdOwner' END + N' FROM APE'; -- 执行动态查询 EXEC sp_executesql @querySql;
MySQL 版本
SET @querySql = NULL; -- 读取元数据拼接查询语句 SELECT CONCAT('SELECT -- 此处填写其他固定需要查询的列,例如:ID, CreateTime, OrderNo ', CASE WHEN COUNT(CASE WHEN COLUMN_NAME = 'RecProdOwner' THEN 1 END) > 0 THEN 'RecProdOwner AS RecProdOwner' WHEN COUNT(CASE WHEN COLUMN_NAME = 'ReconciliationOwner' THEN 1 END) > 0 THEN 'ReconciliationOwner AS RecProdOwner' ELSE 'NULL AS RecProdOwner' END, ' FROM APE' ) INTO @querySql FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'APE'; -- 执行动态查询 PREPARE stmt FROM @querySql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
注意事项
由于两个列存储数据完全一致,上述逻辑默认优先取原生
RecProdOwner列的值,不会出现数据偏差。如果需要调整列的读取优先级,直接调换两个判断分支的顺序即可。
内容的提问来源于stack exchange,提问作者5aadat
相关产品推荐
相关产品推荐

