选择不全为空的列

Selecting columns that are not all 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 的列将全部为空。然后我不想 return 整个专栏。与此相反,如果@subType 为 2,则名称将全部为空,因此我不想要整列。

评论太长了。

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

为了做你想做的事,你需要使用动态 SQL。我不确定这是否适用于您的情况。例如,SQL 服务器用户定义函数不支持动态 SQL。

唯一可以做到这一点的方法是使用动态 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 服务器

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