sql - COALESCE 与 OR IS NULL

标签 sql database postgresql coalesce nvl

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

相关文章:

java - Hibernate 标准 - org.hibernate.QueryException : could not resolve property:

sql - 使用 SQL 从 Oracle 数据库中插入和检索 BLOB 数据的方法有哪些?

php - 我的输入不会将信息插入我的数据库/ fatal error

Postgresql 记录器进程

postgresql - Azure PostgreSQL 无法将 BYPASSRLS 分配给角色

sql - 声明和使用 MySQL varchar 变量

mysql - 外键引用语法错误

sql - MySQL:在存储过程中将多个字段选择为多个变量

python - 在 Python 中从列表列表到文件

python-2.7 - 如何关闭 psycopg2 和 postgresql 之间的旧连接?