我有以下行。我不想选择那些整数值为空的列
col1 col2 col3
1 2 NULL
2 3 NULL
3 4 NULL
. . NULL
. . NULL
. . NULL
100 101 NULL
例如,
我只想选择col1
和col2
,因为col3
的所有值都为空,即如果col3
包含除null之外的任何值,则应选择col1 col2 and col3
。只应选择其他明智的col1 and col2
。
如何在sqlserver
中实现上述scenaria答案 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中隐藏该列。