ORACLE动态查询where子句基于列值

时间:2018-09-27 21:28:41

标签: sql database oracle

我检查了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');

谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用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');