admin

如果该列存在,则选择columnValue,否则为null

sql

我想知道是否可以选择列的值(如果该列存在),否则选择null。换句话说,当列不存在时,我想“举起” select语句来处理这种情况。

SELECT uniqueId
    ,  columnTwo
    ,  /*WHEN columnThree exists THEN columnThree ELSE NULL END*/ AS columnThree
FROM (subQuery) s

注意,我正在巩固我的数据模型和设计。我希望在接下来的几周中排除这种逻辑,但是我真的想超越这个问题,因为数据模型修复比我现在想解决的要耗费更多时间。

另请注意,我希望能够在一个查询中执行此操作。所以我不是在寻找像这样的答案

首先检查子查询中的列。然后修改您的查询以适当地处理您的子查询中的列。


阅读 234

收藏
2021-05-10

共1个答案

admin

您不能使用简单的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

编辑:

我通常不会更新这样的旧问题,而是基于下面的评论。如果“子查询”中的每一行都有唯一的标识符,则可以运行以下命令:

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查询不存在,它将从外部查询中选取。但是,这严重取决于每行具有唯一的标识符。问题明确地是关于子查询的,没有理由期望行可以轻松地唯一标识。

2021-05-10