Oracle条件where子句
是否有任何方法可以编写具有以下功能的查询,以条件方式添加where子句Oracle条件where子句,oracle,oracle11g,case,conditional-statements,where,Oracle,Oracle11g,Case,Conditional Statements,Where,是否有任何方法可以编写具有以下功能的查询,以条件方式添加where子句 select e.emp_id, emp.admin_user from employees e 如果emp.admin!='Y' 然后 使用where子句运行查询 否则 没有where子句运行查询 在WHERE子句中使用大小写表达式应该可以做到这一点。如果不满足条件,则表示不需要where子句,则只需要where 1=1这样的条件,即当不满足条件时,返回所有行。因此,您需要使未满足条件始终为真 比如说, 我有
select e.emp_id, emp.admin_user from employees e
如果emp.admin!='Y'
然后
使用where子句运行查询
否则
没有where子句运行查询
在WHERE子句中使用大小写表达式应该可以做到这一点。如果不满足条件,则表示不需要where子句,则只需要where 1=1这样的条件,即当不满足条件时,返回所有行。因此,您需要使未满足条件始终为真
比如说,
我有一张员工表
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子句,否则返回所有员工详细信息,但过滤满足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>
因此,对于department 20,筛选器由where子句应用,我只获取ename SCOTT的行,对于其他行,它返回所有行。为了保持简单,在本例中,我选择union子句,因此您可以根据需要使用where子句。我试图从上面的评论中猜出您的表结构,让我们看看这个示例:
SQL> create table employees (emp_id number, admin_user number, project_id number);
表已创建
SQL> create table project_accessible_to_user (emp_id number, project_id number);
表已创建
SQL> create table project_accessible_to_user (emp_id number, project_id number);
现在将两个查询进行简单合并,一个带where条件,另一个不带where条件
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,UNION ALL更好,因为这意味着它不检查相交值,所以如果存在任何值,它将返回重复值。但是,在这种情况下,它已经被admin_user上的条件过滤,因此不会出现这些重复项。一个简单的解决方案是添加一个if语句来检查条件,然后有两个select,一个带有where子句,另一个不依赖if语句的结果。您可以在where子句中使用大小写表达式。查看我的答案。如果employees.ADMIN\u USER!='Y'然后选择不同的项目\u id从项目\u可访问\u到\u用户,其中emp\u id=1002332 ELSE ename ENDE select*从项目\u id所在的员工,如果employees.ADMIN\u USER!='然后从PROJECTS\u ACCESSIBLE\u TO\u USR中选择不同的project\u id,其中emp\u id=1002332,否则ename END是否正确?最好将两个表连接起来。提供表格详细信息。编辑您的问题和所需的详细信息。如果有帮助,请将其标记为已回答。它也会帮助其他人。工会可能是一个性能杀手。。。值得一提的是,即使在更复杂的查询中,人们也会开始使用它,这就是问题所在。我已经见过很多次了-使用UNION ALL进行非常长的查询,使用UNION进行更糟的查询只是为了通过一个查询获得结果。。。不管代价如何。。