对于我的情况,我想知道是否有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工作的条件完全相同。但是,我想知道哪个会更好。另外,我想知道这些查询的推荐表索引。
答案 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)
上的索引。