【问题标题】:Selecting columns that are not all null选择不全为空的列
【发布时间】:2019-04-17 11:54:22
【问题描述】:

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

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

【问题讨论】:

  • SELECT 语句的结果集必须具有恒定的形状,在编译时确定。如果要返回不同的,取决于@subType,你必须使用多个语句并使用IF..ELSE在它们之间进行选择。但是,这可能会使处理结果变得更加困难,因为现在您的客户将无法指望所有存在的列。
  • 你为什么想要这样的查询?它将在每种情况下返回不同的数据类型,这意味着 客户端 必须将它们全部视为文本、对象、动态或弱类型值,具体取决于语言
  • 顺便说一句,此查询不会返回 NULL。如果subtype 为 3,您将获得name onlyAddressID 都不会返回。
  • @PanagiotisKanavos 当子类型为 3 时,它会为 id 返回 null。
  • [address] 将返回 @subtype 的值是 3,@PanagiotisKanavos,CASE 表达式是 case when @subType = 3 or @subType = 2 then address end as address

标签: sql sql-server case sql-null


【解决方案1】:

您可以做到这一点的唯一方法是使用动态 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不要将参数值注入到动态语句中。

【讨论】:

  • 这正是我所追求的。非常感谢。
【解决方案2】:

评论太长了。

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

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

【讨论】:

  • 用户可以使用双表然后可以在SQL server中创建!!
  • @nikhilsugandh 那会做什么? dual 只是一个数字表。它不影响空值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2015-02-13
  • 2013-01-20
  • 1970-01-01
  • 2011-04-01
相关资源
最近更新 更多