首页 > 解决方案 > ORACLE根据列值动态查询where子句

问题描述

我已经检查了动态查询的 SO 问题/响应,讨论了 CASE.. WHEN.. END。但是,请注意,这是 Oracle 的新手,无法为我的用例找到合适的解决方案。谢谢。

我有以下示例数据,并且根据条件我需要获取给定部门的 EMPID:

DEPTNO  EMP_ID  IS_PRIMARY  SDATE   EDATE     IS_ACTIVE
11250   12321   Y         01-Jan-17 29-Apr-18   N
11250   12343   N         01-Jan-17 29-Apr-18   N
11250   87653   N         16-Jul-18 31-Dec-00   Y

如果 IS_PRIMARY = 'Y' & IS_ACTIVE = 'Y',则主要验证是返回部门的 EMPLOYEE ID (11250)。如果 IS_PRIMARY 为 'N',则返回员工 ID,其中 IS_ACTIVE = 'Y',(这意味着根据查询我应该得到员工 ID 87653)。

我尝试了以下查询,但正在获取所有记录,有人可以帮助我吗?

select EMP_ID from employee a where (a.deptno='81B11' and a.is_primary = 'Y') or (a.deptno='81B11' and a.is_active='Y' and a.is_primary_territory='N');

谢谢

标签: sqldatabaseoracle

解决方案


您可以EXISTS用来检查部门是否存在主要和在职员工。如果他们只选择它们。如果它们不存在,只需选择活动的。

SELECT e1.emp_id
       FROM employee e1
       WHERE e1.deptno = '81B11'
             AND (EXISTS (SELECT *
                                 FROM employee e2
                                 WHERE e2.deptno = e1.deptno
                                       AND e2.is_primary = 'Y'
                                           e2.is_active = 'Y')
                  AND e1.is_primary = 'Y'
                  AND e1.is_active = 'Y'
                   OR NOT EXISTS (SELECT *
                                         FROM employee e2
                                         WHERE e2.deptno = e1.deptno
                                               AND e2.is_primary = 'Y'
                                                   e2.is_active = 'Y')
                      AND e1.is_active = 'Y');

推荐阅读