COALESCE VS或为NULL

时间:2019-06-11 12:45:45

标签: sql database postgresql coalesce nvl

对于我的情况,我想知道是否有2个表:

员工: id, city, job_level

过滤器: city, job_level, some_val

我有一个查询,例如:

SELECT * 
FROM   employee e 
WHERE  NOT EXISTS(SELECT 1 
                  FROM   filters f 
                  WHERE  e.city = COALESCE(f.city, e.city) 
                         AND ( f.job_level IS NULL 
                                OR e.job_level = f.job_level )) 

如果您可以看到城市和job_level工作的条件完全相同。但是,我想知道哪个会更好。另外,我想知道这些查询的推荐表索引。

1 个答案:

答案 0 :(得分:2)

从性能的角度来看,这并不会真正起到作用。您有一个复杂的WHERE子句,该子句已经包含一个OR条件。这几乎无法使用索引。

鉴于您对COALESCE()所做的工作,我认为OR IS NULL更清晰。

如果您关心性能,则可以考虑将其分为多个比较:

WHERE NOT EXISTS (SELECT 1 
                  FROM filters f 
                  WHERE e.city = f.city AND 
                        ( f.job_level IS NULL  OR e.job_level = f.job_level )
                 ) AND
      NOT EXISTS (SELECT 1 
                  FROM filters f 
                  WHERE f.city IS NULL AND 
                        ( f.job_level IS NULL  OR e.job_level = f.job_level )
                 ) 

这至少可以利用filters(city, job_level)上的索引。