我想知道我的场景是否有 2 个表:
员工:
id, city, job_level
过滤器:
城市,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)
上的索引。
关于sql - COALESCE 与 OR IS NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56544078/