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

2023-11-25

我有以下表格:

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 = '#'

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

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

一种非常不同的方法将使结果集仅包含允许的列。在这种情况下,您需要动态构建 sql 语句。我不知道您是在存储过程中还是在主机语言中执行此操作,但基本思想是这样的:

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

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


OP澄清后的更多信息:

好的,您需要 sql 函数返回一个类似于“column1,column2,...”的字符串。下面类似于 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL:根据另一个表中的列值选择列 的相关文章

  • 在 WHERE 子句中使用 mysql SUM()

    假设我有这张桌子 id cash 1 200 2 301 3 101 4 700 我想返回第一行 其中之前所有现金的总和大于某个值 例如 如果我想返回第一行 其中之前所有现金的总和大于 500 则应该返回到第 3 行 如何使用 mysql
  • 选择视图的列

    我正在尝试选择 a 的列名称view以类似的方式选择information schema columns 我似乎找不到办法做到这一点 有其他人以前这样做过或者知道这是否可能吗 information schema columns Table
  • 从表变量中获取列的明确名称

    我可以这样声明一个表变量 DECLARE tv source TABLE c1 int providerName varchar 50 providerSMS varchar 50 如果我执行以下命令 我会看到类似于以下内容的表名称 468
  • 数据流任务的 Foreach 循环容器

    我想从 Oracle DB 导入近 1200 万条记录 但由于 SSIS 内存缓冲区问题 我需要每年迭代我的数据流任务 即 2005 年到 2012 年 7 次 我如何使用 foreach 我的 oracle 查询来获取每年的数据 Quer
  • 如何在会话过期后自动更新数据库而不刷新我的页面

    您需要刷新或单击该代码 然后它才会转到索引页面 并且在会话过期后更新数据库之前 如何让会话过期后自动更新数据库 使用户活跃度为0 而无需刷新或点击页面 idletime 3600 after 1hr the user gets logged
  • INSERT INTO 存储过程的输出

    我正在编写一个存储过程 首先在表中插入一个新行 然后 另一个查询需要此查询生成的 ID 是否可以使用 OUTPUT 访问预先生成的 ID 这就是我到目前为止所做的 这几乎是一个猜测 但没有成功 ALTER PROCEDURE dbo add
  • 测试 ODBC 连接的有效方法

    我们的产品是一个 TCP 监听事务处理器 传入连接被分配一个线程来处理连接和一个数据库连接来使用 我们维护一个数据库连接池 而不是为每个传入的客户端连接建立新的数据库连接的昂贵方法 数据库连接池相当可配置 最小 最大大小 增长率等 一些细节
  • 数据库中无法识别的数据类型 nvarchar

    我尝试将 MySQL 服务器数据导入 PHPMyAdmin MySQL 数据库 无法识别的数据类型 nvarchar 发现 我的数据库排序规则设置为 utf general ci 您不必担心 nvarchar 消息 它是由 phpmyadm
  • 限制 SQL 查询的响应时间

    我在这里发布了一个关于我的 gridview 绑定的问题 将GridView与多条记录绑定 https stackoverflow com questions 5599704 bind gridview with many records
  • 数据库记录的多级菜单

    我需要一些有关 PHP 的帮助 我有一个工作正常的多级 css 菜单 但现在我想根据数据库中的记录生成 菜单代码 div ul class dropdown li a href Link 1 a li li a href Link 2 a
  • 防止 Node.js 中的 SQL 注入

    是否有可能以与 PHP 具有防范 SQL 注入的预准备语句相同的方式防止 Node js 中的 SQL 注入 最好使用模块 如果是这样 怎么办 如果不 有哪些例子这可能会绕过我提供的代码 见下文 一些背景 我正在制作一个 Web 应用程序
  • 根据多列删除重复记录

    在我们的系统中 我们每小时从外部数据库进行导入 由于导入脚本中存在错误 现在存在一些重复记录 如果任何记录具有相同的内容 则视为重复 legacy id and company 我可以运行什么代码来查找并删除这些重复项 我正在玩这个 Pro
  • Django 在第二个数据库上调用存储过程

    我试图在多数据库 Django 安装上调用存储过程 但没有获得结果 存储过程 位于辅助数据库上 在 Django 中始终返回一个空数组 但在 mysql 客户端中执行时确实会出现预期结果 My view py文件 从 SomeDBModel
  • SQLite适合并发读吗?

    在没有锁定的情况下 SQLite 数据库的性能是否能达到每秒 50 次读取左右 我正在尝试确定它是否可以在不会经常 写入 的 PHP 网站上使用 它主要是从一小部分表中读取相同的数据 没问题 并发读 写实际上会被 SQLite 序列化 所以
  • 使用非管理员帐户时,SQL Linked Server 返回错误“不存在登录映射”

    我有一个本地 SQL Server 2008R2 我已将链接服务器配置为远程数据库 当我使用 SQL 登录帐户登录本地服务器时 链接服务器工作得很好sysadmin服务器角色 我可以查询远程服务器 因此我知道链接服务器设置是正确的 但是 如
  • 用于监视文件夹和更新数据库的 Python 守护进程

    这专门用于管理 MP3 文件 但它应该可以轻松地适用于任何包含大量文件的目录结构 我想找到或编写一个守护程序 最好用Python 来监视一个包含许多子文件夹的文件夹 这些子文件夹都应该包含X个MP3文件 每当添加 更新或删除文件时 它都应该
  • mysql 中的 SELECT UNION 和 ORDER BY.. 如何?

    我想从单个表中获取所有行 但以不同的方式对它们进行排序 例如我写 SELECT FROM table1 ORDER BY fieldA ASC LIMIT 3 UNION SELECT FROM table1 ORDER BY FieldB
  • 如何限制灵活搜索查询的结果数据

    我想限制灵活搜索查询中的结果数据 假设查询每次只应返回 10 条记录 如 LIMIT 我怎样才能做到这一点 您已经回答了您的查询 您可以使用 LIMIT 因为与我们在 MySQL 中使用的相同 Try this SELECT FROM Pr
  • 使用实体框架的子查询

    我正在移植一个子系统NHibernate to 实体框架并希望了解将以下查询移植到的最佳方法EF var date DateTime Now It can be any day AccountBalanceByDate abbd null
  • 从 MySql 迁移到 Sql Server 2008

    我有大约 200 GB 的 Mysql 转储文件 现在我需要迁移到 Sql server 2008 那么我应该遵循什么方法 我应该继续逐行 sql 语句还是有任何适合我的要求的 GUI 工具 微软 SQL Server 迁移 Assista

随机推荐

  • 在 Pandas DataFrame 中创建多列的所有可能组合

    鉴于以下数据框 df pd DataFrame Student Siri Alexa Class 6 7 Section A B Teacher Ravi Mark School C D 我想返回一个包含所有列值的所有可能组合的表 我使用下
  • 如何永久删除 Google 管理的虚拟机

    我无法永久删除我创建的由 Google App Engine 管理的虚拟机 我已从开发人员控制台和使用 gcloud 命令多次删除它们 在每种情况下 命令都会成功完成并删除虚拟机 但随后 Google 几乎立即创建一个全新的虚拟机来取代它
  • docker和主机之间的PID映射

    docker 命名空间与主机命名空间有何不同以及 pid 如何在这两者之间映射 谁能给我一个想法 有助于使用源代码在主机和 docker 之间映射 pid 的简单方法 您可以在中找到映射 proc PID status文件 它包含这样一行
  • 实体框架是否支持循环引用?

    我有两个具有父 子关系的实体 此外 父级包含对 主 子级的引用 因此简化模型如下所示 class Parent int ParentId int MainChildId class Child int ChildId int ParentI
  • caret::train:指定模型生成参数

    我正在使用caretR 中用于模型生成的库 我想生成一个earth 又名 MARS 模型 我想指定degree该模型生成的参数 根据文档 第 11 页 earth方法支持此参数 指定参数时出现以下错误消息 gt library caret
  • JSch会话超时限制

    我正在使用 JSch 0 1 50 为我的 CI Jenkins 插件设置到远程服务器的连接 假设我想在这里使用session connect 60000 超时 60 秒 Session session null try JSch jsch
  • 在 1 和 0 的矩形中找到最大块的简单方法

    我正在尝试提出暴力 天真的 解决方案来找到 1 和 0 的矩形中最大的 1 或 0 块 我知道可以做到这一点的最佳方法O n 时间 其中 n 是矩形的总大小 1 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0
  • 有 Perl 或 Lua 可以替代 Capistrano 吗?

    对于许多 Web 应用程序 我需要像 Capistrano 这样的东西来自动化部署 我知道 Capistrano 可以用来部署非 ruby 应用程序 但我对 Ruby 不熟悉 所以我预计编写部署配置可能会有点痛苦 所以我想知道 除了用 Pe
  • JavaScript - 更改 CSS 颜色 5 秒

    我试图找到一种方法来简要突出显示命名链接上的文本 但只持续几秒钟 a href faq1 因此 在常见问题解答列表中 它会跳转到正确的 ID 将颜色更改为红色几秒钟 作为最终用户的视觉提示 答案就在这里 但随后返回正常颜色并且间隔完成 如何
  • 如何在不使用TOP和子查询的情况下从表中获取第n高的工资?

    最近在一次采访中 我被要求编写一个查询 在该查询中我必须从表中获取第 n 个最高薪水 而不使用 TOP 和任何子查询 我完全困惑了 因为我知道实现它的唯一方法同时使用 TOP 和子查询 请提供其解决方案 提前致谢 尝试 CTE 通用表表达式
  • Angular UI 路由器嵌套视图

    我有这样的结构 div div
  • 从 .txt 文件中用 C++ 美化 JSON 字符串

    我目前正在使用 C 工作 从使用 ostream 写入 txt 文件的请求中获取 HTTP 响应 这是异步发生的 我不想改变它 数据写入完成后 我想从文件中读取 data request type City query London Uni
  • Visual Studio 中仅调试类和资源 - 这可能吗?

    是否可以将一个类添加到 Visual Studio 中的项目中 并仅为该项目的调试配置构建该类 也就是说 它根本不会出现在Release构建中 如果可以的话 是否也可以对资源做同样的事情 我正在特别考虑仅在调试配置中运行但从程序集中删除以供
  • 合成属性是否已分配/初始化?

    如果我有一个习惯NSObject名为 ProgramModel 的类 当我时它是否获得 alloc init ed property and synthesize来自另一个班级 例如 在这样的 ProgramController 类中 Pr
  • 查找 Go 切片或数组中的唯一项

    我是个新手 现在我真的非常非常困惑 假设我有一个坐标列表 并且假设我在这个坐标列表中有一些双精度数 我一生都无法弄清楚如何制作一份独特的清单 通常在 Python 中我可以使用集合和其他内置函数来 作弊 在 Go 中则不然 package
  • R:ggplot ylim 不起作用

    我正在尝试改变情节中的 ylim 但一旦我改变它 情节就消失了 我无法弄清楚原因 有人可以帮助我找出问题的根本原因吗 gt df lt data frame Category c A B C D B A D C Setup c X Y Ga
  • 如何有效地检索 Facebook 照片 URL 的到期日期并在到期前续订?

    主要问题 应用程序缓存来自 Facebook 照片 CDN 的 URL 照片有时会过期 我的 技术 问题 Facebook CDN 过期 标头似乎不可靠 或者我不知道如何处理它们 使用 CURL 检索过期日期 curl i X HEAD h
  • Maven Mirror - 如果镜像主机不可用,如何绕过?

    我有一个 Maven 镜像存储库 Archiva 例如
  • CSS @keyframes 规则分组

    我完全理解你cannot组动画关键帧选择器 例如 keyframes moz keyframes webkit keyframes do something 并且你绝对MUST do keyframes do something moz k
  • SQL:根据另一个表中的列值选择列

    我有以下表格 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