我想知道如果该列存在,我是否可以选择该列的值,否则只选择 null。换句话说,我想“提升” select 语句来处理列不存在时的情况。
SELECT uniqueId
, columnTwo
, /*WHEN columnThree exists THEN columnThree ELSE NULL END*/ AS columnThree
FROM (subQuery) s
请注意,我正在巩固我的数据模型和设计。我希望在未来几周内排除这种逻辑,但我真的很想超越这个问题,因为数据模型修复比我现在想要解决的工作更耗时。
另请注意,我希望能够在一个查询中完成此操作。所以我不是在寻找像这样的答案
首先检查子查询中有哪些列。然后修改你的
查询以正确处理子查询中的列。
您无法使用简单的 SQL 语句来完成此操作。除非表中的所有表和列引用都存在,否则 SQL 查询不会编译。
如果“子查询”是表引用或视图,则可以使用动态 SQL 来执行此操作。
在动态 SQL 中,您可以执行以下操作:
declare @sql nvarchar(max) = '
SELECT uniqueId, columnTwo, '+
(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;
对于实际的子查询,您可以通过检查子查询是否返回具有该列名的内容来近似相同的结果。一种方法是运行查询:select top 0 * into #temp from (<subquery>) s
然后检查中的列#temp
.
EDIT:
我通常不会更新这样的老问题,而是根据下面的评论。如果“子查询”中的每一行都有唯一标识符,则可以运行以下命令:
select t.. . ., -- everything but columnthree
(select column3 -- not qualified!
from t t2
where t2.pk = t.pk
) as column3
from t cross join
(values (NULL)) v(columnthree);
子查询将拾取column3
如果不存在,则从外部查询中获取。然而,这主要取决于每行都有唯一的标识符。问题明确地与子查询有关,并且没有理由期望可以轻松唯一地标识行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)