COALESCE 与 OR IS NULL

COALESCE Vs OR IS NULL

我想知道我的场景是否有 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 )) 

如果您能看到 city 和 job_level 的条件完全相同。但是,我想知道哪个性能更好。另外,我想知道为此类查询推荐的这些表的索引。

从性能的角度来看,它不会真正产生影响。您有一个复杂的 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) 上的索引。