Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle条件where子句_Oracle_Oracle11g_Case_Conditional Statements_Where - Fatal编程技术网

Oracle条件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这样的条件,即当不满足条件时,返回所有行。因此,您需要使未满足条件始终为真 比如说, 我有

是否有任何方法可以编写具有以下功能的查询,以条件方式添加where子句

      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进行更糟的查询只是为了通过一个查询获得结果。。。不管代价如何。。