gpt4 book ai didi

mysql - SQL:根据另一个表中的列值选择列

转载 作者:可可西里 更新时间:2023-11-01 06:46:14 25 4
gpt4 key购买 nike

我有以下表格:

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 |
+--------+------+------+------+

我的问题最简单的形式与 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 = '#'

当然,“特殊值”可能是个问题,因为您需要一个永远不会出现在数据中的值。如果您需要知道 null 之间的区别,因为实际值为 null 与 null,因为它是一个禁止的列,那么您不能使用 null。

另一种方法是让您简单地包含结果中出现的每一列的权限指示符,并让您的业务逻辑使用它来确定哪些值对用户可见。

一个非常不同的方法是让结果集只包含允许的列。在这种情况下,您需要动态构建 sql 语句。我不知道你是在存储过程中还是在宿主语言中这样做,但基本思想是这样的:

string sqlCmd = "SELECT " 
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd

“执行”意味着您可以将字符串作为 sql 命令执行。


OP 澄清后的更多内容:

好的,您需要 sql 函数返回一个类似于“colname1, colname2, ...”的字符串。以下类似于它在 sql server 中的样子。语法

create function   
FIELDS_NAME_QUERY (@userid int)
begin
select col1, col2, col3... INTO @col1priv, @col2priv, @col3priv FROM userPrivileges WHERE UserId = @UserId
declare @result varhcar(60)
set @result = ''
if (@col1priv = 1) @result = 'col1'
if (@col2priv = 1) @result = @result + ' ,col2'
if (@col3priv = 1) @result = @result + ' ,col3'
return @result
end

关于mysql - SQL:根据另一个表中的列值选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8676354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com