选择不全为空的列

问题描述 投票:-1回答:2

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

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,所以我不想要整个列。

sql sql-server case sql-null
2个回答
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
投票

这个评论太长了。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.