`

sql语句的位运算

 
阅读更多

数据库采用1,2,4,8,16.....等用数字标识的状态字段可以进行累加,对存在的几种状态进行组合,从而可形成各种组合状态

例如:一条记录该字段原来的数字是,2,如我们想加上4,则可以用

update t_User set iFlag = iFlag | 4 where UserID = 1

(iFlag 为该字段名)

例2:在加上4之后我们想去掉4怎么办呢,可以这样实现

update t_User set iFlag = iFlag ^ 4 where UserID = 1

这样就又把4从该记录中去掉了.

如果我们想选择所有为2的记录该怎么做呢,可以这样实现

select * from t_User where iFlag & 2 = 2

SQL中的位运算不但可以取出各种值,而且我们可以对他对数据进行排序

举例如下,新闻列表中的一个字段标识为

1:置顶

2:不置顶

4:推荐

8:不推荐

该字段的值可以为这4种状态的组合,如果我们根据一定条件想把所有置顶的放在前面该如何做呢

select * from t_News order by iFlag & 1 desc

这样我们就把所有置顶的贴子排在前面,当然这里可以加上一定的Where 条件,在Where 里也可可以加一定的位运算

 

在权限中的应用

1、两张表

(1)、操作与权限标志表

if exists (select * from sysobjects where id = OBJECT_ID('[RightTags]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [RightTags]

CREATE TABLE [RightTags] ( 
[Pkid] [int]  IDENTITY (1, 1)  NOT NULL, 
[RightsName] [nvarchar]  (50) NOT NULL, 
[RightsTag] [int]  NOT NULL DEFAULT (0))

ALTER TABLE [RightTags] WITH NOCHECK ADD  CONSTRAINT [PK_RightTags] PRIMARY KEY  NONCLUSTERED ( [Pkid] ) 

SET IDENTITY_INSERT [RightTags] ON 
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 1,'吃饭',1) 
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 2,'拉屎',2) 
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 3,'打炮',4) 
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 4,'泡妞',8) 
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 5,'生子',16) 
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 6,'包二奶',32) 
SET IDENTITY_INSERT [RightTags] OFF

20100205011709875

(2)、用户与权限表

if exists (select * from sysobjects where id = OBJECT_ID('[RightUsers]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [RightUsers]

CREATE TABLE [RightUsers] ( 
[Pkid] [int]  IDENTITY (1, 1)  NOT NULL, 
[FUser] [nvarchar]  (50) NOT NULL, 
[UserRights] [int]  NOT NULL DEFAULT (0))

ALTER TABLE [RightUsers] WITH NOCHECK ADD  CONSTRAINT [PK_RightUsers] PRIMARY KEY  NONCLUSTERED ( [Pkid] ) 

SET IDENTITY_INSERT [RightUsers] ON 
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 1,'张三',7) 
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 2,'李四',9) 
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 3,'王老板',63) 
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 4,'朱麻子',0) 
SET IDENTITY_INSERT [RightUsers] OFF

20100205011725281

 

2、访问判断是否有权限

--1.查询权限 
declare @iRights as int 
select @iRights=(select top 1 RightsTag from RightTags where RightsName='打炮') 
--print @iRights 
select * from RightUsers where UserRights&@iRights=@iRights --所有可以打炮的人 
select * from RightUsers where FUser='李四' and UserRights&@iRights=@iRights   --此人是否可以打炮(有无记录集) 
select * from RightUsers where FUser='王老板' and UserRights&@iRights=@iRights --此人是否可以打炮(有无记录集)

go

 

3、设置权限

--2.设置权限 
declare @yourRights int 
select @yourRights=(select sum(RightsTag) from RightTags where RightsName in('吃饭','拉屎','打炮')) 
--print @yourRights

update RightUsers set UserRights=@yourRights where FUser='张三' 
go

 

4、查看此人的所有权限

--3.查看此人的所有权限 
declare @yourRights as int 
select @yourRights=(select UserRights from RightUsers where FUser='李四') 
print @yourRights

select * from RightTags where @yourRights&RightsTag=RightsTag 
go

 

5、检测权限表权限值是否为2的整数次方(操作权限标志的有效性:唯一+2的整数次方)

select power(2,6) --64
select power(2.000,5.500) --45.255

select log(64.000)/log(2.000)--6.0

------------------------------
declare @setNewOperateRightTags int --添加一个新操作权限
set @setNewOperateRightTags=64  --64是2的整数次方
--set @setNewOperateRightTags=63  --63不是2的整数次方

declare @number float
set @number=log(@setNewOperateRightTags)/log(2.000)
--print @number
if(ceiling(@number)=floor(@number))--取最大整数=取最小整数
begin
  print cast(@setNewOperateRightTags as varchar(16)) + '是2的整数次方,可以用作权限标志值'
end
else
begin
  print cast(@setNewOperateRightTags as varchar(16)) + '不是2的整数次方,不能用作权限标志值'
end

3
1
分享到:
评论
6 楼 luanxiyuan 2013-09-03  
魔力猫咪 写道
select * from t_User where iFlag & 2 = 2

别的我就不说了,权限模型是否合理暂时还没分析出来,我就说你这个SQL,你准备全表查询到什么时候?打算把数据库累死不成?每次查询都要全表啊。

有什么更好的方法供分享?请指教。。。
5 楼 魔力猫咪 2013-09-03  
select * from t_User where iFlag & 2 = 2

别的我就不说了,权限模型是否合理暂时还没分析出来,我就说你这个SQL,你准备全表查询到什么时候?打算把数据库累死不成?每次查询都要全表啊。
4 楼 luanxiyuan 2013-09-03  
teasp 写道
非常好的一篇文章。

3 楼 teasp 2013-09-03  
非常好的一篇文章。
2 楼 luanxiyuan 2013-09-02  
可怜的猫 写道
小伙子不错,继续努力哈。

谢大神夸奖!
1 楼 可怜的猫 2013-09-02  
小伙子不错,继续努力哈。

相关推荐

    SQL语句在审计

    SQL语句在审计中的应用 SQL语句是数据库管理系统中使用最频繁的语言,SELECT语句是SQL语言中使用频率最高的语句。SELECT语句的作用是让数据库服务器根据用户的要求搜索出所需要的信息资料,并按规定的格式进行整理...

    利用MD5 求sql语句中的sql_id

    2. **计算MD5哈希值**:使用MD5函数对SQL语句进行哈希运算。在Python中,你可以使用`hashlib`库来实现: ```python import hashlib sql_statement = "SELECT * FROM table_name WHERE condition" md5_hash = ...

    SQL语句手册.chm

    在“SQL语句手册.chm”中,我们可以期待找到关于SQL的全面介绍,包括其基本概念、语法以及如何执行各种操作。下面我们将深入探讨SQL的关键知识点。 1. **SQL基础**: SQL的基本组成部分包括数据定义语言(DDL)、...

    ORACLE_SQL语句

    根据给定的文件信息,以下是对Oracle SQL语句的关键知识点的详细解读: ### Oracle SQL语句概述 Oracle SQL是Oracle数据库系统中用于管理和查询数据的标准语言。它提供了强大的功能来处理复杂的数据库操作,包括...

    经典SQL语句大全(各种sql语句)

    以下是对标题和描述中提到的经典SQL语句的详细解释和扩展: 1. **创建数据库**:`CREATE DATABASE database-name` 用于创建一个新的数据库,其中`database-name`是你为新数据库指定的名称。 2. **删除数据库**:`...

    经典SQL语句大全

    以下是对标题和描述中涉及的经典SQL语句的详细说明: 1. **创建数据库**:`CREATE DATABASE`语句用于创建新的数据库。例如:`CREATE DATABASE myDatabase;` 这将创建名为`myDatabase`的新数据库。 2. **删除数据库...

    关于关系代数运算与SQL语句的等价实现的分析与研究.pdf

    关系代数运算是数据库原理课程中的重点和难点内容,是理论基础的组成部分,而SQL语句则是数据库管理和维护的实践工具。关系代数运算包括传统的集合运算和选择、投影、连接等操作。SQL语句包括SELECT、FROM、WHERE、...

    数据库SQL语句大全

    数据库SQL语句大全 数据库SQL语句大全是一个涵盖了数据库管理系统中各种SQL语句的详细指南。以下是从基础知识到高级查询操作的详细解释: 一、数据库管理系统基础知识 1. 创建数据库:CREATE DATABASE database-...

    关系代数中交运算与差运算的SQL语句实现.pdf

    "关系代数中交运算与差运算的SQL语句实现" 关系代数是关系数据操纵语言的一种传统表达方式,是结构化查询语言SQL的重要理论基础。在关系代数中,交运算、差运算和除运算是八种常用运算中最重要的三个。然而,SQL中...

    索引的SQL语句优化

    ### 知识点详解:“索引的SQL语句优化” #### 重要性 在数据库管理中,SQL(Structured Query Language)语句的优化是确保系统高效运行的关键环节。特别是在大型数据库环境中,一次低效的SQL查询可能会导致整个...

    sql初学者指南(sql语句示意图)

    ### 一、SQL语句的标准图 SQL语句主要包括以下几种类型: 1. **数据查询语言 (DQL)**:用于从数据库中检索数据,如`SELECT`语句。例如: ```sql SELECT * FROM Customers WHERE Country='USA'; ``` 这个语句将...

    经典SQL语句大全(全面提升你的SQL水平)

    该资源涵盖了创建数据库、删除数据库、备份数据库、创建新表、删除新表、增加列、添加主键、创建索引、创建视图、基本的SQL语句、复杂查询运算词等多方面的SQL知识点。 1. 创建数据库:CREATE DATABASE database-...

    SQL语句高级查询

    ### SQL语句高级查询知识点详解 #### 实验背景与目的 本次实验主要聚焦于SQL语句的高级查询技术,旨在深化学生对SQL查询的理解,并熟练掌握SQL Server 2000查询分析器的使用,以及如何运用SELECT语句进行多表查询...

    sql 语句自学宝典

    ### SQL 语句自学宝典知识点详述 #### 第一天:SQL简介与历史 - **SQL简史**:SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,首次出现在20世纪70年代初,由IBM的研究员Donald D. ...

    SQL语句大全详细宝典

    以下将详细讲解标题和描述中提到的一些SQL语句及其重要知识点。 1. **创建数据库**: 使用`CREATE DATABASE`语句可以创建一个新的数据库。例如,`CREATE DATABASE database-name`会创建一个名为`database-name`的...

    经典SQL语句大全 含注解示例

    ### 经典SQL语句大全含注解示例解析 #### 一、基础知识与操作 1. **创建数据库** - **SQL语句**: `CREATE DATABASE database-name;` - **说明**: 此命令用于创建一个新的数据库。`database-name`为用户自定义的...

    sql server 中sql语句大总结

    在SQL Server中,SQL语句是用于管理和操作数据库的核心工具,涵盖了数据定义、数据操纵和数据控制等各个方面。以下是对这些语句的详细说明: 1. **DDL (数据定义语言)**: - `CREATE`:用于创建数据库对象,如...

Global site tag (gtag.js) - Google Analytics