从至少有一个值为 NULL 的 table 中检索行的最简单方法

Easiest way to retrieve rows from a table with at least one value in NULL

使用 MSSSQL 我有一个包含 20 多个列的 table,我想检索至少有一个列值为 NULL 的行。哪种方法最有效,还是必须这样写?:

Select * from tableName where col1 is null or col2 is null or col3 is null....

谢谢!

最有效的方法是 pre-calculate 这些值(持久计算列)(如果这适合您的情况),然后为它们建立索引并进行查询。这是背后的想法:

CREATE TABLE #temp
(
    col1 int,
    col2 int,
    col3 int,
    col_calculated AS CASE WHEN col1 IS NULL OR col2 IS NULL OR col3 IS NULL THEN 0 ELSE 1 END PERSISTED
);

CREATE INDEX IX_TEMP_COLCALCULATED ON #temp(col_calculated);

INSERT INTO #temp VALUES(1, 2, 3), (5, 6, NULL);

SELECT * FROM #temp WHERE col_calculated = 0;

考虑到 SQL 服务器将需要检查每一行中的每一列以做出决定(至少直到它在给定列中找到 NULL 值)。这意味着无论您碰巧如何组织查询,它都将进行完整的 table 扫描。因此,虽然可能有 "prettier" 种查询方法,但就性能而言,我怀疑您会找到任何更快的方法。

@Denis 建议的计算列是一个例外,但那是因为 SQL 服务器有效地提前完成了相同的工作(甚至更多的工作,因为现在它必须写出到持久索引)。在这一点上,性能影响对您来说最重要的问题是找到这些列,或者每次写入 table.