所以我有一个看起来像这样的查询-
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,所以我不希望整个列都如此。
答案 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。