2015-03-13 70 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上的條件進行過濾,因此這些重複項不會發生。