选择不全为空的列
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
的调用参数化; 不要将参数值注入动态语句。
所以我有一个看起来像这样的查询 -
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
的调用参数化; 不要将参数值注入动态语句。