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尝试。