【问题标题】:SELECT WHERE CASE statementSELECT WHERE CASE 语句
【发布时间】:2013-03-23 03:27:47
【问题描述】:

我正在开展一个项目,在该项目中,用户对记录的访问受到基于用户的用户组的限制。我创建了一个全局变量 $usr_sec_group,并且我想在几个应用程序的 SELECT 语句中的 WHERE 子句中添加一个 CASE 语句,该语句根据 $usr_sec_group 的值应用不同的过滤器。关于 mySQL,我是一个相对的“新手”,我尝试编写这样的语句并没有奏效。基本逻辑如下:

SELECT 
   field1,
   field2,
   etc
FROM
  Organizations
CASE $user_sec_group
  WHEN 1 THEN 'filter_statement_1'
  WHEN 2 THEN 'filter_statement_2'
  WHEN 3 THEN 'filter_statement_3'
  ELSE 'filter_statement_else'
END CASE
ORDER By
   field1

“filter_statements”可以是任何有效的过滤器,例如

'oName => 'a' AND oName < 'g'

我假设问题是一个相对简单的语法问题,但到目前为止我还没有能够编写一个有效的 CASE 语句。

我将不胜感激!

最好的问候,

埃里克

【问题讨论】:

    标签: select case where


    【解决方案1】:

    您尝试的解决方案将不起作用:这不仅仅是语法问题,您必须使用动态 sql。即使你使用了动态 sql,它也不是管理访问权限的好方法。

    更好的方法是在不同的访问级别创建特定视图,然后向特定用户授予适当的访问权限并撤销其他用户的访问权限:

    GRANT SELECT ON MyDatabase.viewABC 
        TO 'someuser'@'somehost';
    

    【讨论】:

    • 感谢米奇,您的回复。我最初考虑创建更多视图,因为我使用的应用程序开发工具集 (ScriptCase) 有一个用于管理用户对视图/应用程序的访问的模块。但是,我希望找到一种更优雅的解决方案,它不会增加需要维护的视图/应用程序的数量。
    • 视图通常是一件好事(前提是您对视图的视图等没有视图)。
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多