验证列是否具有空值

MOZ*_*LLA 2 sql sql-server oracle performance null

如果特定列具有空值,哪种SQL会更快验证,为什么?

1)SELECT*FROM TABLE1 WHERE COL1为NULL

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

2)从TABLE1中选择COUNT(COL1),其中COL1为NULL

读取返回的计数以确定是否存在任何空记录

使用Oracle10g和SQLServer2005.

SQL*_*ace 6

Count(columnName)永远不会计算NULL值,count指定列名时会跳过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
Run Code Online (Sandbox Code Playgroud)

我会使用exists,因为它是一个布尔操作,并将在第一次出现NULL时停止

IF EXISTS (SELECT 1 FROM testnulls WHERE ID IS NULL)
PRINT 'YES'
ELSE
PRINT 'NO'
Run Code Online (Sandbox Code Playgroud)


Thi*_*ilo 5

以kquinn的答案为基础,在Oracle中即可

SELECT COL1 FROM TABLE1 WHERE COL1 IS NULL AND ROWNUM = 1;
Run Code Online (Sandbox Code Playgroud)

这样DBMS只需要在给出答案之前读取一行;

然而,这种说法具有误导性.它必须读取所有行,直到找到具有缺失列值的行.然后它可以停止并返回该行.

如果没有这样的行,它将读取整个表.

因此,可以使用COL1上的索引来满足查询,从而使查询更快.

仅指定COL1不会产生太大影响,至少在Oracle上,其中(常规B树)索引不能用于查找NULL值.

如果您有兴趣稍后识别该行,则可能还需要选择更多列(例如主键值).