我想知道如果列存在,我可以选择列的值,否则选择null.换句话说,我想“提升”select语句来处理该列不存在的情况.
SELECT uniqueId,columnTwo,/*WHEN columnThree exists THEN columnThree ELSE NULL END*/ AS columnThree FROM (subQuery) s
注意,我正在中间巩固我的数据模型和设计.我希望在接下来的几个星期内排除这个逻辑,但我真的很想超越这个问题,因为数据模型的修复比现在想要处理的时间要长一些.
另外请注意,我希望能够在一个查询中执行此操作.所以我不是在寻找一个答案
check what columns are on your sub query first. Then modify your
query to appropriately handle the columns on your sub query.
解决方法
您不能使用简单的sql语句来执行此操作.除非表中的所有表和列引用都存在,否则SQL查询将无法编译.
如果“子查询”是表引用或视图,则可以使用动态sql执行此操作.
在动态sql中,您将执行以下操作:
declare @sql nvarchar(max) = ' SELECT uniqueId,'+ (case when exists (select * from INFORMATION_SCHEMA.COLUMNS where tablename = @TableName and columnname = 'ColumnThree' -- and schema name too,if you like ) then 'ColumnThree' else 'NULL as ColumnThree' end) + ' FROM (select * from '+@SourceName+' s '; exec sp_executesql @sql;
对于一个实际的子查询,您可以通过检查子查询是否返回与该列名称相关的内容来估计相同的事情.一种方法是运行查询:从(<子查询>)s中选择top 0 *到#temp,然后检查#temp中的列.