选择不全为空的列

时间:2019-04-17 11:54:23

标签: sql sql-server case sql-null

所以我有一个看起来像这样的查询-

select 
case when @subType = 1 or @subType = 2 then id end as Id,
case when  @subType = 3 then name end as name
case when @subType = 3 or @subType = 2 then address end as address
from 
table

所以我遇到的问题是,如果@subType为3,则名为ID的列将全部为空。然后,我不想返回整列。相反,如果@subType为2,则name都将为null,所以我不希望整个列都如此。

2 个答案:

答案 0 :(得分:2)

唯一可行的方法是使用动态SQL(如Gordon所述)。如果这是一个查询视图,而不是函数视图,则可以执行以下操作:

DECLARE @subType tinyint = 3;

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT ' +
           STUFF(CASE WHEN @subType IN (1,2) THEN N',' + NCHAR(13) + NCHAR(10) + N'       id' ELSE N'' END + 
                 CASE WHEN @subType = 3 THEN N',' + NCHAR(13) + NCHAR(10) + N'       [name]' ELSE N'' END + 
                 CASE WHEN @subType IN (3,2) THEN N',' + NCHAR(13) + NCHAR(10) + N'       [address]' ELSE N'' END, 1, 10,N'') + NCHAR(13) + NCHAR(10) +
           N'FROM YourTable;';

PRINT @SQL; --Your debugging best friend.
--EXEC sp_executesql @SQL; --Uncomment to run the statement

但是,如果查询来自表示层,那么实际上应该是在处理要显示的列,而不是SQL Server

如果您也将参数传递给查询的WHERE,请确保参数化对sp_executesql的调用; 请勿将参数值插入动态语句中。

答案 1 :(得分:1)

这个评论太长了。

SQL查询返回一组固定的列,其名称和类型在SELECT中定义。它不能具有可变的列数。

为了执行所需的操作,您将需要使用动态SQL。我不确定这是否在您的情况下有效。例如,SQL Server用户定义函数不支持动态SQL。