SQL Query动态选择而不使用IF..THEN

时间:2013-07-28 16:16:43

标签: sql sql-server sql-server-2008 left-join

我有以下数据库模式:

enter image description here

用户表存储登录的用户。字段“overridetemplate”是一个布尔值,告诉我们是否获取用户安全模板信息或用户覆盖信息。

user_access 表将用户与security_template(如用户角色)相关联。

security_template 表包含安全模板信息(例如:高级用户等)

security_template_exception 包含对模板具有访问权限的所有操作(例如:“insert_user”,访问类型为“FullAccess”,“delete_user”,访问类型为“拒绝”)

因此,这样一来,用户就拥有了一个角色或安全模板,并且该模板有一堆带有该用户访问类型的“操作”。

然后,我有一个额外的表, user_override_template ,它是为覆盖安全模板而创建的,然后您可以为用户分配单独的操作权限,而不会影响完整的安全模板。

只有3种类型的“accessstype:”FullAccess“,”ReadOnly“和”Deny“。

现在,带来安全操作访问权限的查询如下:

SELECT
                        ste.[objectid], ste.[accesstype]
                    FROM
                        [user] AS u
                        JOIN [users_access] AS ua ON u.[userid] = ua.[userid]
                        JOIN [security_template] AS st ON ua.[templateid] = st.[templateid]
                        JOIN [security_templates_exceptions] AS ste ON st.[templateid] = ste.[templateid]
                    WHERE
                        su.[userid] = @userid

查询结果如下:

enter image description here

所以,我需要的是依赖字段“overridetemplate”我应该从“user_override_template”或“security_template_exception”获取访问信息。

有关如何不使用的任何线索(我想在一次选择中执行此操作):

IF @overridetemplate = 1
BEGIN

END
ELSE
BEGIN

END

1 个答案:

答案 0 :(得分:0)

您可以在select子句中执行两个连接并选择所需的连接:

SELECT (case when @UseSecurityTemplate = 'Y' then ste.[objectid]
             else uto.objectid
        end) as objectid
       (case when @UseSecurityTemplate = 'Y' then ste.[accesstype]
             else uto.accesstype
        end) as AccessType
FROM [user] AS u
     LEFT JOIN [users_access] AS ua ON u.[userid] = ua.[userid]
     LEFT JOIN [security_template] AS st ON ua.[templateid] = st.[templateid]
     LEFT JOIN [security_templates_exceptions] AS ste ON st.[templateid] = ste.[templateid]
     LEFT JOIN [user_override_template] AS uot ON ua.[templateid] = uot.[templateid]
WHERE su.[userid] = @userid;

我将连接切换到left outer join以防止在没有行的情况下进行不必要的过滤。