2015-03-13 72 views
2

有没有办法写有如下功能查询,添加where子句的条件的方式,甲骨文条件where子句

 select e.emp_id, emp.admin_user from employees e 

如果emp.admin!= 'Y'

然后

查询运行与where子句

其他

查询运行时没有where子句?

+0

一个简单的解决方案是添加一个if语句来检查条件,然后有两个select,一个使用where子句,另一个不依赖于if语句的结果。 – Sim1 2015-03-13 08:09:28

+0

您可以在where子句中使用** CASE **表达式。看到我的答案。 – 2015-03-13 08:34:32

+0

select * from employees WHERE project_id in( CASE WHEN employees.ADMIN_USER!= 'Y',那么 THEN(选择PROJECTS_ACCESSIBLE_TO_USER不同的PROJECT_ID其中EMP_ID = 1002332) ELSE的ename END ) – user3374229 2015-03-13 09:11:21

回答

3

使用在WHERE子句应该做的伎俩一个CASE表达。如果条件不满足时,如果你说你不需要where子句,那么所有你想要的是像WHERE 1 = 1这样的条件,即当条件不满足时返回所有行。所以,你需要像往常一样使不符合条件TRUE

例如,

我有一个雇员表,

SQL> SELECT empno, ename, deptno 
    2 FROM emp; 

    EMPNO ENAME   DEPTNO 
---------- ---------- ---------- 
     7369 SMITH    20 
     7499 ALLEN    30 
     7521 WARD    30 
     7566 JONES    20 
     7654 MARTIN    30 
     7698 BLAKE    30 
     7782 CLARK    10 
     7788 SCOTT    20 
     7839 KING    10 
     7844 TURNER    30 
     7876 ADAMS    20 
     7900 JAMES    30 
     7902 FORD    20 
     7934 MILLER    10 

14 rows selected. 

SQL> 

我想选择员工的详细信息,如果部门20,然后使用WHERE子句否则返回所有雇员的细节,但过滤器符合哪里条件的部门。

SQL> SELECT empno, ename, deptno 
    2 FROM emp 
    3 WHERE ename = 
    4 CASE 
    5  WHEN deptno = 20 
    6  THEN 'SCOTT' 
    7  ELSE ename 
    8 END 
    9/

    EMPNO ENAME   DEPTNO 
---------- ---------- ---------- 
     7499 ALLEN    30 
     7521 WARD    30 
     7654 MARTIN    30 
     7698 BLAKE    30 
     7782 CLARK    10 
     7788 SCOTT    20 
     7839 KING    10 
     7844 TURNER    30 
     7900 JAMES    30 
     7934 MILLER    10 

10 rows selected. 

SQL> 

因此,对于部门20,过滤器由where子句应用,我只得到了一行的ename SCOTT,对其他人而言,返回的所有行。

+0

SELECT * FROM员工 WHERE PROJECT_ID在( CASE WHEN employees.ADMIN_USER!= 'Y',那么 THEN (从PROJECTS_ACCESSIBLE_TO_USR中选择不同的project_id,其中emp_id = 1002332) ELSE ename END )is this query is correct? – user3374229 2015-03-13 09:10:54

+0

最好加入这两张表。提供表格细节。编辑你的问题和所需的细节。 – 2015-03-13 09:31:52

+0

如果它对您有帮助,请将其标记为已回答。它也会帮助其他人。 – 2015-03-13 10:25:14

1

为了保持简单,我会在这种情况下使用union子句,以便您可以根据需要使用where子句。我试图从上面的评论中猜测你的表格结构,我们来看看这个例子:

SQL> create table employees (emp_id number, admin_user number, project_id number); 

Table created。

SQL> create table project_accessible_to_user (emp_id number, project_id number); 

表创建。

现在进行简单的UNION ALL两个查询一个用WHERE条件anoother没有它

SQL> select * from employees e where e.admin_user!='Y' and project_id in 

(select project_id from project_accessible_to_user where emp_id=e.emp_id)  

union all 

select * from employees e where (e.admin_user is null or 
e.admin_user='Y'); 

UNION ALL是从视图UNION表现好点,因为这意味着它不检查交叉值,所以如果有任何它会返回重复。但是在这种情况下,它已根据admin_user上的条件进行过滤,因此这些重复项不会发生。