使用COALESCE在多个列上查找非空

时间:2014-11-04 09:16:36

标签: sql sql-server-2012 notnull

我有一个查询在一个视图的表上的2列上找不到null,因此需要花费大量的时间来执行。 查询是:Query1

SELECT [Table1].M, [[Table1]].B, [Table1].P
FROM [Table1]
WHERE ((([[Table1]].B) Is Not Null) AND (([[Table1]].P) Is Not Null));

以下查询是否与Query1执行相同的功能,执行时间更短?

SELECT [Table1].M, [[Table1]].B, [Table1].P
FROM [Table1]
WHERE COALESCE (([[Table1]].B),([[Table1]].P)) Is Not Null

任何帮助都会提供很大帮助,并提前致谢。

查看查询

select dbo.TABLE1.[COL1]
    , dbo.TABLE1.[COL2]
    , RIGHT(dbo.TABLE1.M, 12) as M
    , dbo.TABLE2.[MD]
    , dbo.TABLE1.[COL3]
    , dbo.TABLE1.[COL4]
    , dbo.TABLE3.COL1
    , dbo.TABLE3.[COL2]
    , dbo.TABLE3.[COL3]
    , dbo.TABLE4.[COL1]
    , dbo.TABLE5.[COL1]
    , dbo.TABLE6.[COL1]
    , dbo.TABLE7.[COL1] as [BA]
    , dbo.TABLE8.[COL1]
    , dbo.TABLE3.[COL4]
    , dbo.TABLE3.[COL5]
    , dbo.TABLE3.[COL6]
from dbo.TABLE1
left outer join dbo.TABLE2
    on dbo.TABLE1.M = dbo.TABLE2.M
left outer join dbo.TABLE3
    on dbo.TABLE1.M = dbo.TABLE3.M
left outer join dbo.TABLE5
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE5.OBJ
left outer join dbo.TABLE6
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE6.OBJ
left outer join dbo.TABLE7
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE7.OBJ
left outer join dbo.TABLE4
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE4.OBJ
left outer join dbo.TABLE8
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE8.OBJ
where (
        (
            dbo.TABLE1.[COL1] not in (
                'XX'
                , 'YY'
                )
            )
        and (dbo.TABLE1.COL5 = 'x')
        )

2 个答案:

答案 0 :(得分:2)

不,两个查询都不等同。

第二个中的WHERE子句等同于

WHERE [[Table1]].B Is Not Null OR [[Table1]].P Is Not Null

COALESCE将评估第一个参数,如果不为null则返回它。否则,如果不为null,它将返回第二个,依此类推,直到到达最后一个参数,无论其值是什么,都将返回该参数。所以COALESCE(...) IS NOT NULL只需要一个非空值来返回true,而不是全部。

答案 1 :(得分:0)

我已经在我的开发数据库的桌面上尝试了这个。结果如下:

只有PK索引:800万个表中400万个选定记录的2分钟

索引在3个选定列上(没有PK)1.8秒。

您可能需要进行一些测试才能为您的设置获取正确的索引,但以下是我更改的示例:

select [col1]
    , [col2]
    , [col3]
from [dbo].[tbl]
where col2 is not null
    and col3 is not null

create nonclustered index [idx_test] on [dbo].[tbl] (
    [col2] asc
    , [col3] asc
    ) INCLUDE ([col1])