Sql server 仅当不为null时获取列是否为sql server 2012?

Sql server 仅当不为null时获取列是否为sql server 2012?,sql-server,Sql Server,我有以下行。我不想选择整数值为空的列 col1 col2 col3 1 2 NULL 2 3 NULL 3 4 NULL . . NULL . . NULL . . NULL 100 101 NULL 比如说,, 我只想选择col1和col2,因为col3的所有值都为null,即如果col3包含除null以外的任何值,则应选择col1 col2和col

我有以下行。我不想选择整数值为空的列

col1   col2   col3
 1      2     NULL
 2      3     NULL
 3      4     NULL
 .      .     NULL 
 .      .     NULL 
 .      .     NULL
 100    101   NULL
比如说,, 我只想选择col1和col2,因为col3的所有值都为null,即如果col3包含除null以外的任何值,则应选择col1 col2和col3。只应选择其他明智的col1和col2


如何在sqlserver中实现上述场景

目前可能有一种更好/更有效的方法,但您可以尝试下面的方法,即混合使用o位TSQL脚本和动态SQL。被戏弄过,效果很好。下面是一个示例代码

create table test1(col1 int,col2 int);

insert into test1(col1) values(2),(3),(4)

declare @col1sum int, @col2sum int, @countrow int;

 -- This query will get you NULL count for all columns
select  @col1sum = sum(case when col1 is null then 1 else 0 end), 
@col2sum = sum(case when col2 is null then 1 else 0 end),
@countrow = count(1) 
 from test1;

 select @col1sum, @col2sum, @countrow; --for display

 declare @sql varchar(100);

  -- check for column null count < total count of rows
 if(@col1sum < @countrow)
 set @sql = 'select col1 from test1';
 else if(@col2sum < @countrow)
 set @sql = 'select col2 from test1';
 else
 set @sql = 'select col1,col2 from test1';

 exec(@sql); -- Finally execute the dynamic sql

如果您想按照David在评论中建议的方式在UI中进行隐藏,但让数据库来帮助您,您可以在windows中使用聚合函数来添加一些额外的列:

declare @t table (col1 int,col2 int,col3 int)
insert into @t(col1,col2,col3) values
 (1     ,2    ,NULL),
 (2     ,3    ,NULL),
 (3     ,4    ,NULL),
 (9     ,NULL ,NULL),
 (100   ,101  ,NULL)

 select
    col1,CASE WHEN MAX(col1) OVER () IS NULL THEN 0 ELSE 1 END as col1_HasValues,
    col2,CASE WHEN MAX(col2) OVER () IS NULL THEN 0 ELSE 1 END as col2_HasValues,
    col3,CASE WHEN MAX(col3) OVER () IS NULL THEN 0 ELSE 1 END as col3_HasValues
from @t
这将生成结果集:

col1        col1_HasValues col2        col2_HasValues col3        col3_HasValues
----------- -------------- ----------- -------------- ----------- --------------
1           1              2           1              NULL        0
2           1              3           1              NULL        0
3           1              4           1              NULL        0
9           1              NULL        1              NULL        0
100         1              101         1              NULL        0

_HasValues列在所有行中都是相同的,并告诉您前一列中是否有任何行具有非空值。如果为0,则应在UI中隐藏该列。

为什么一列中会充满空值?返回动态列集的目的是什么?您不想静态地知道所选列的集合吗?场景是用户只想看到那些不为null的列。@SparAby:这听起来像是UI问题,而不是数据库问题。UI技术可以检查数据并有条件地显示/隐藏列。是的,我可以从UI端处理该场景。问题是可能有数千个数据,我担心遍历每一行会影响应用程序的性能。这就是为什么我想通过db尝试。