有没有办法用以下功能编写查询,将where子句添加为条件方式,
select e.emp_id, emp.admin_user from employees e
如果是emp.admin!='Y'
然后
使用where子句
运行查询其他
查询运行没有where子句?
答案 0 :(得分:6)
在 WHERE 子句中使用 CASE 表达式应该可以解决问题。当你说如果不满足条件你不需要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>
因此,对于部门20,过滤器由where子句应用,我只获取ename SCOTT的行,而其他行则返回所有行。
答案 1 :(得分:0)
为了简单起见,我会在这种情况下使用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> 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上按条件过滤,因此不会发生这些重复。