仅当列不为空时才获取列是sql server 2012吗?

时间:2014-06-17 12:02:26

标签: sql-server

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

col1   col2   col3
 1      2     NULL
 2      3     NULL
 3      4     NULL
 .      .     NULL 
 .      .     NULL 
 .      .     NULL
 100    101   NULL

例如, 我只想选择col1col2,因为col3的所有值都为空,即如果col3包含除null之外的任何值,则应选择col1 col2 and col3 。只应选择其他明智的col1 and col2

如何在sqlserver

中实现上述scenaria

2 个答案:

答案 0 :(得分:0)

可能存在更好/更有效的方式,但您可以尝试以下混合使用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

答案 1 :(得分:0)

如果你想按照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列在所有行中都是相同的,并告诉您任何行在前一列中是否具有非NULL值。如果它是0,您应该在UI中隐藏该列。