SQL Server查询排除所有空值

时间:2012-11-29 14:11:31

标签: sql sql-server sql-server-2008

我正在尝试构建一个查询,允许我计算 NULL

的行
SELECT count(*) 
FROM jSettings 
WHERE linkToJData = '56211010105' 
  AND tblName1 IS NOT NULL 
  AND tblName2 IS NOT NULL;

我的列名为tblName1 - tblName25

我想要完成的是找出tblNameXX without NULL中有多少{。}}。

上述查询每次只生成1

6 个答案:

答案 0 :(得分:4)

SELECT
 sum(case when tblName1 is null then 0 else 1 end) +
 sum(case when tblName2 is null then 0 else 1 end) +
 sum(case when tblName3 is null then 0 else 1 end) +
 sum(case when tblName4 is null then 0 else 1 end) +
 sum(case when tblName5 is null then 0 else 1 end) +
 sum(case when tblName6 is null then 0 else 1 end) +
 sum(case when tblName7 is null then 0 else 1 end) +
 sum(case when tblName8 is null then 0 else 1 end)   
FROM jSettings 
WHERE linkToJotData = '56211010105'

无需结合多个结果集。这种技术只需要对数据进行一次传递。

答案 1 :(得分:0)

这里的问题是AND条件。如果您提供AND条件,则只会获得填充TBLNAME1..25的所有值的记录。 但您的要求是单独查找有多少记录没有空值。

你可以为每一列使用union并分别得到计数,然后将它们相加得到非空值的总数。

如果这是预期的,请告诉我。

答案 2 :(得分:0)

那是因为你正在寻找tblName1和tblName2都为空的记录。这是你的意图吗?如果不是,那么你可以试试:

Select count(*) totalrows 
From jSettings 
where linkToJData = '56211010105' 
  and (tblName1 IS NOT NULL OR tblName2 IS NOT NULL)

答案 3 :(得分:0)

您可以执行以下操作

declare @Data xml = 
(
    select *
    from jSettings
    where linkToJData = '56211010105'
    for xml path('row')
)

select count(*)
from @Data.nodes('/row/*[local-name(.) != "linkToJData"]') as T(C);

如果您不想使用xml,可以使用此查询:

select count(*)
from jSettings as j
    outer apply (values
        (j.tblName1),
        (j.tblName2),
        (j.tblName3),
        (j.tblName4),
        (j.tblName5)
    ) as C(name)
where j.linkToJData = '56211010105' and c.name is not null;

如果你有很多列而不想手动指定它:

declare @stmt nvarchar(max)

select @stmt =
    isnull(@stmt + ', ', '') + '(j.' + c.name + ')'
from sys.syscolumns as c
where id = object_id('dbo.jSettings') and c.name <> 'linkToJData'

select @stmt = '
select count(*)
from jSettings as j
    outer apply (values ' + @stmt + ') as C(name)
where j.linkToJData = @linkToJData and c.name is not null'

exec sp_executesql
    @stmt = @stmt,
    @params = N'@linkToJData nvarchar(128)',
    @linkToJData = '56211010105'

<强> sql fiddle demo

我建议使用第一个或第三个 - 因此您无需更改新列的查询

答案 4 :(得分:0)

Select 'tblName1',count(*) totalrows1 
From jSettings 
where linkToJData = '56211010105' 
  and tblName1 IS NOT NULL
union
Select 'tblName2',count(*) totalrows2
From jSettings 
where linkToJData = '56211010105' 
  and tblName2 IS NOT NULL

尝试使用此代码获取个人计数。

答案 5 :(得分:0)

SELECT
 sum(case when tblName1 is null then 0 else 1 end) +
 sum(case when tblName2 is null then 0 else 1 end) +
 sum(case when tblName3 is null then 0 else 1 end) +
 sum(case when tblName4 is null then 0 else 1 end) +
 sum(case when tblName5 is null then 0 else 1 end) +
 sum(case when tblName6 is null then 0 else 1 end) +
 sum(case when tblName7 is null then 0 else 1 end) +
 sum(case when tblName8 is null then 0 else 1 end)   
FROM jSettings 
WHERE linkToJotData = '56211010105' 

报告 7 这是正确的,因为唯一具有 NULL 的表是tblName8。