2013-04-11 85 views
1

我想实现一个查询只返回登录的用户,并显示有只记录,这是我做了如下,它的工作原理:PL/SQL Oracle查询用IF语句

SELECT * FROM EMPLOYEE 
WHERE UPPER(username) = v('APP_USER') 

然而,我有另一个名为User_Type的列,并且用户可以是类型1,2或3.如果我有用户类型1,我希望查询也返回所有表记录,因为用户类型1是管理员。

我想过做这样的:

BEGIN 
SELECT * FROM Employee 
WHERE upper(username) = v('APP_USER') 
IF User_Type = 1 
THEN SELECT * FROM Employee 
END IF; 
END; 
/

不过,这并不在APEX的Oracle PLSQL工作。

有什么建议吗?

回答

2

你想要UPPER(username)v('APP_USER')User_Type的用户的所有记录为1?然后,只需使用OR

SELECT * FROM Employee WHERE upper(username) = v('APP_USER') OR User_Type = 1 

如果这不是你的意思,那么你就可以解释清楚一点吗?

+0

当只使用app_user时,只返回该用户名记录,除非该用户具有'1'用户类型,然后返回整个表。 – 2013-04-11 12:03:28

+0

我不明白。可能有许多记录满足'upper(username)= v('APP_USER')'? – drquicksilver 2013-04-11 12:09:46

1

尝试:

select distinct e2.* 
from employee e1 
join employee e2 on (e1.username = e2.username or e1.User_Type = 1) 
where UPPER(e1.username) = v('APP_USER') 
+0

非常理解和紧凑,但我只是有点担心表现,因为我是一个很大的'独特的'恐惧。你能解释性能影响吗? – Rachcha 2013-04-11 12:30:45

+1

'distinct'包含在超过一个员工记录符合'UPPER(e1.username)= v('APP_USER')'条件的机会中 - 如果这种情况永远不会发生,那么'distinct'就可以被删除。在查询相对较大的表格时(例如数十万条记录),可能会对性能产生显着影响 - 但员工表通常相对较小,因此对性能的影响可能相对较小。 – 2013-04-11 12:35:22

7

从我的理解,你需要试试这个:

DECLARE 
    emp employee%ROWTYPE; -- Create a record type 
    tbl_emp IS TABLE OF emp; 
    -- ^^^ Create a table of that record type 
    v_user_type employee.user_type%TYPE; 
    -- ^^^ Variable to store user type 
BEGIN 
    SELECT user_type 
    INTO v_user_type 
    FROM Employee 
    WHERE upper(username) = v('APP_USER'); 

    IF v_user_type = 1 THEN 
    SELECT * 
      BULK COLLECT INTO tbl_emp 
     FROM employee; 
    -- ^^ Returns the entire table 
    ELSE 
    SELECT * 
      BULK COLLECT INTO tbl_emp 
     FROM employee; 
    WHERE upper(username) = v('APP_USER'); 
    -- ^^ Returns the row related to the user. 
    END IF; 
END; 
/

输出存储在嵌套表变量tbl_emp

编辑:

它可以使用纯SQL还,这样来实现:

SELECT * 
    FROM employee e 
WHERE EXISTS (SELECT 1 
       FROM employees e_in 
       WHERE e_in.user_type = 1 
        AND UPPER(e_in.username) = v('APP_USER')) 
    OR UPPER(e.username) = v('APP_USER') 

可以任意选择最适合你的。