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