优化多列的空检查方式

时间:2019-05-14 08:33:58

标签: sql sql-server

假设我有一个包含三列的表,并且我想获取至少一列值不为null的所有行,现在我正以下面的方式使用coalesce()进行null检查,并且运行良好

with Test_name AS(

    select null as id , null as f_name , null as l_name
    union ALL
    select 1,'fname1', null
    union ALL
    select null,null,null
) select tn.* from Test_name tn where coalesce(id,f_name,l_name) is not null

预期的输出,这给了我查询

1,'fname1', null

我想知道还有没有更好的方法来进行空检查

2 个答案:

答案 0 :(得分:2)

您可以通过三种方式检查行中是否为非NULL值:

  1. COALESCE(col1, col2, col3) IS NOT NULL
  2. col1 IS NOT NULL OR col2 IS NOT NULL OR col3 IS NOT NULL
  3. ISNULL(col1, ISNULL(col2, ISNULL(col3, NULL))) IS NOT NULL

您可以使用Microsoft SQL Server Management Studio来比较多个查询。

比较结果:

  • COALESCEIS NOT NULL:57%至43%
  • COALESCEISNULL:56%至44%
  • IS NOT NULLISNULL:49%至51%

因此,使用IS NOT NULL是检查行是否具有不带NULL值的列的最快方法。如果具有可读性,则COALESCE可能比IS NOT NULLISNULL的比较短。您可以在可读性和速度之间做出决定。

答案 1 :(得分:1)

您可以像这样添加计算列

ALTER TABLE myTableName
ADD newColumnName AS (CASE
                    WHEN id IS NULL
                         AND fname IS NULL
                         AND lname IS NULL
                    THEN 0
                    ELSE 1
                END) PERSISTED

然后您可以轻松查询表

SELECT 
*
FROM myTable 
WHERE newColumnName = 1