我有以下表格:
UserPrivileges:
+--------+------+------+------+
| UserID | Col1 | Col2 | Col3 |
+--------+------+------+------+
| 1 | 0 | 1 | 1 |
| 2 | 0 | 0 | 1 |
| 3 | 1 | 0 | 0 |
| 4 | 1 | 1 | 0 |
+--------+------+------+------+
Data:
+--------+------+------+------+
| DataID | Col1 | Col2 | Col3 |
+--------+------+------+------+
| 1 | A | B | C |
| 2 | D | E | F |
| 3 | G | H | I |
| 4 | J | K | L |
+--------+------+------+------+
Run Code Online (Sandbox Code Playgroud)
我最简单的问题与Data表没有任何关系,但我只是解释它,以便我可能以错误的方式做到这一点.
如何根据值从UserPrivileges中选择列名?这样我就可以在另一个查询中使用结果来只选择那些列.
这些方面的东西:
SELECT (COLUMNS_NAME_QUERY_FROM_UserPrivileges(UserID='#')) WHERE DataID = '#' FROM Data
或者我不介意管理特定列的用户权限的更好方法.
答案取决于您对结果的要求.无论用户权限如何,您是否需要具有一致列集的结果?如果是这样,您可以使用IF子句将不允许的值设置为null(或其他一些特殊值),例如,
SELECT IF (p.col1 = 0 THEN NULL ELSE d.col1) AS col1,
IF (p.col2 = 0 THEN NULL ELSE d.col2) AS col2,
IF (p.col3 = 0 THEN NULL ELSE d.col3) AS col3
FROM Data d,
UserPrivileges p
WHERE p.userId = '#'
AND d.DataId = '#'
Run Code Online (Sandbox Code Playgroud)
当然,"特殊值"可能是个问题,因为您需要一个永远不会出现在数据中的值.如果您需要知道null之间的差异,因为实际值为null而不是null,因为它是禁止列,那么您不能使用null.
另一种方法是让您简单地在结果中包含每列的权限指示符,并让您的业务逻辑使用它来确定哪些值对用户可见.
一种非常不同的方法是将结果集仅包含允许的列.在这种情况下,您需要动态构建sql语句.我不知道你是在存储过程中还是在宿主语言中这样做,但基本的想法是这样的:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
Run Code Online (Sandbox Code Playgroud)
"执行"意味着您可以执行字符串作为sql命令.
经过OP澄清后更多:
好的,你需要sql函数返回一个看起来像"colname1,colname2,..."的字符串.以下类似于sql server中的样子.句法
__CODE__