条件sql WHERE子句基于列值

时间:2012-02-07 12:04:34

标签: mysql

我有一个存储用户的表。每位用户都有IDNameAccess Level。三个可能的Access LevelsAdministratorManagerSimple User

我想要的是根据Access Level值从该表中有条件地选择。我演示了以下逻辑:

  1. 如果用户为Administrator,则选择所有用户(Administrators, Managers, Simple Users
  2. 如果用户Manager选择所有Managers和所有Simple Users
  3. 否则,如果用户Simple User只选择自己
  4. 这可能吗?

4 个答案:

答案 0 :(得分:2)

提供访问级别是一个随实际访问级别而增加的整数: 管理员= 3 经理= 2 用户= 1

然后

SELECT * FROM USERS
WHERE ACCESS_LEVEL <= (SELECT ACCESS_LEVEL FROM USERS WHERE ID = @ID)

只需将小于标志切换为大于相反的标志。

适用于SQL-server

编辑:为了得到你想要的东西你可以使用这样的东西:

SELECT id,name FROM users where ID = @id
UNION DISTINCT
SELECT id, name from users where access_level <= 
    (select case when access_level = 1 then 0 else access_level end
    from users where id = @id)

通过这样的查询,您将选择当前access_level或更低级别的所有用户。 只有在您的access_level为1(例如普通用户)时才会例外,然后才会选择您自己的用户。

答案 1 :(得分:1)

Oracle中,该概念称为行级安全性。请参阅thisthis等文章,以帮助您入门。

答案 2 :(得分:1)

您可以使用以下代码

If(access_level=='administrator'){   str query = 'select * from users';}else if(access_level=='manager'){    str query = 'select * from users where  access_level!="administrator"'; }else{   str query = 'select * from users where access_level="users"'; }

答案 3 :(得分:1)

可能有点矫枉过正,但可以使用以下存储过程来实现您的目标:

DROP procedure IF EXISTS `listAccessibleUsers`;

DELIMITER $$
CREATE PROCEDURE `listAccessibleUsers`(IN user_id INT)
BEGIN
  DECLARE u_access_level INT;

  -- Select the user access level  
  SELECT access_level 
  FROM users
  WHERE users.id = user_id
  INTO u_access_level;

  -- Result for simple users
  IF u_access_level = 1 THEN
    SELECT id, name, access_level 
    FROM users
    WHERE users.id = user_id;
  -- Result for admistrators and managers
  ELSE
    SELECT id, name, access_level  
    FROM users
    WHERE access_level <= u_access_level;  
  END IF;
END$$

DELIMITER ;

调用代码示例:

CALL listAccessibleUsers(200);