2009-04-21 39 views
2

如果某个特定列的值是否为空,哪个SQL会更快以验证它,为什么?验证列是否具有空值

1)SELECT * FROM表1 WHERE COL1 IS NULL

执行此查询,然后检查是否能够读取任何记录。如果是,则存在空值。

2)SELECT COUNT(COL1)FROM表1 WHERE COL1 IS NULL

阅读被返回,以确定是否有任何空记录

用于Oracle10g和SQLServer2005的工作计数。

回答

4

我不知道甲骨文,但对于SQL Server此选项可能会是最快的是:

SELECT TOP 1 COL1 FROM TABLE1 WHERE COL1 IS NULL; 

这样的数据库管理系统只给你答案之前阅读单行;其他选项必须读取全部非空行。并且我已指定COL1而不是*,因此可能可以通过COL1上的索引满足查询,使查询更快。

+0

只是选择一个nit,数据库可能仍然需要读取多行。当它最终达到符合标准的一个时,它就能够停下来。它仍然必须阅读任何不符合标准的内容,直到达到该标准。另外,使用EXISTS会带来相同的优势,我相信它将与ANSI兼容。 – 2009-04-21 13:55:27

5

大厦kquinn的回答,在Oracle中,这将是

SELECT COL1 FROM TABLE1 WHERE COL1 IS NULL AND ROWNUM = 1; 

这样的数据库管理系统只给你答案之前阅读单行;

但是,该陈述有误导性。它必须读取所有行,直到找到缺少列值的行。然后它可以停止并返回该行。

如果没有这样的行,它会读取整个表格。

所以可以用COL1上的索引满足查询,使查询更快。

仅指定COL1不会产生太多的影响,至少在Oracle上,(常规B-Tree)索引不能用于查找NULL值。

如果您有兴趣稍后确定行,您可能需要选择更多的列(例如主键值)。

+1

Hm,在PostgreSQL(我选择的数据库),B-Tree索引(默认值)* do *存储关于NULL值的信息,*可以*用于满足查询中的IS NULL条件;我同意你的观点,如果索引无法使用,那么使索引覆盖查询不会有多大帮助。您需要了解SQL Server索引如何处理NULL并查看其行为是否像Postgres或Oracle一样。 – kquinn 2009-04-21 07:07:16

6

计数(列名),我决不算NULL值,计数时,您指定的列名,当您使用*

运行不计NULLS跳过NULLS这

CREATE TABLE testnulls (ID INT) 
INSERT INTO testnulls VALUES (1) 
INSERT INTO testnulls VALUES (2) 
INSERT INTO testnulls VALUES (null) 

SELECT count(*) FROM testnulls WHERE ID IS NULL --1 

SELECT count(ID) FROM testnulls WHERE ID IS NULL --0 

我会用存在替代,因为这是一个布尔操作,将在NULL中第一次出现停止

IF EXISTS (SELECT 1 FROM testnulls WHERE ID IS NULL) 
PRINT 'YES' 
ELSE 
PRINT 'NO' 
0

多解(列包含空值的一些|列全是NULLs *测试单列|如果你需要测试多个列测试与表格结果多列)

,你可以使用以下命令:

Column_1 Column_2 Column_3 
-------- -------- -------- 
1  2  NULL 
1  NULL  NULL 
5  6  NULL 

首先,测试空值并计数:

select 
    sum(case when Column_1 is null then 1 else 0 end) as Column_1, 
    sum(case when Column_2 is null then 1 else 0 end) as Column_2, 
    sum(case when Column_3 is null then 1 else 0 end) as Column_3, 
from TestTable 

产生NULL的计数:

Column_1 Column_2 Column_3 
0   1   3 

Wher e结果为0,没有NULL。

,让我们计算非空值:

select 
    sum(case when Column_1 is null then 0 else 1 end) as Column_1, 
    sum(case when Column_2 is null then 0 else 1 end) as Column_2, 
    sum(case when Column_3 is null then 0 else 1 end) as Column_3, 
from TestTable 

...但因为我们这里计算非空值,这可以简化为:

select 
    count(Column_1) as Column_1, 
    count(Column_2) as Column_2, 
    count(Column_3) as Column_3, 
from TestTable 

无论是一个产出:

Column_1 Column_2 Column_3 
3   2   0 

如果结果为0,则列为irely由NULL组成。

最后,如果你只需要检查一个特定的列,那么TOP 1更快,因为它应该停止在第一个命中。然后,您可以选择使用COUNT(*),得到一个布尔风格的结果:

select count(*) from (select top 1 'There is at least one NULL' AS note from TestTable where Column_3 is NULL) a 

0 =没有空值,1 =至少有一个NULL

select count(*) from (select top 1 'There is at least one non-NULL' AS note from TestTable where Column_3 is not NULL) a 

0 =他们所有NULL,1 =至少有一个非NULL我希望这有助于。

相关问题