Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 查询  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/VS.NET2005
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 AppleVB
 我家网
 911静态资料2
 a9 BBS
 911搜什么
 MCSE技术论坛
 CSharp911.net
 BBS新闻列表
 911静态资料
 911搜C S D N
 911搜全国公交线路
 Office中国
 Java 编程资料站
 Access开发在线
 Access软件网
 CSDN
 MS Support
 上海朋扬电脑
 access爱好者
 交流中心
 ezlavie
 艾赛思俱乐部
 设计在线
 搜CSDN V2
 搜CSDN V3
 oaup
 宇宙网络
 
访问人次
 1004269
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何在查询中使用 AND 操作符进行位操作

作者:cg1 & v-binyao & John Berry  摘自:access911.net  :cg1  更新日期:2004-4-7  浏览人次:

 

问题:

有关查询中的“位与”问题
比如:
select * from mytable where (字段1 & 2) =2

上面的sql查询如何在ACCESS里实现 


这样,我出题目你做做看好吗?
表:
姓名(str)   状态(byte)
abc           2(0010)
abd           1(0001)
abb           3(0011)

注:四位分别表示如下:
0        0         0        0
健康   工作中     开心    已领供给
那么如何查询既健康又开心的记录呢? 


我做了以下试验

VBA 中
debug.print cbyte(10) and cbyte(10)


结果等于10

而 ACCESS 的查询中输入以下代码

select (cbyte(10) and cbyte(10)) as newfield from anytablename

结果却是 -1

 


方法一:

据我所知,ACCESS 数据文件(mdb)表的字段数据类型中没有内建
的位数据类型的概念,只有数字数据类型字段长度为字节。 对于你
的问题,其实关键在于设计,也就是说你状态字段的定义。你可以
采用如下定义:

状态(数字类型)
1(0001)     健康
2(0001)     工作中
4(0100)     开心
8(1000)     已领供给

对于具有多个状态的纪录,你可以简单的把相应的状态为相加来表
示。如果是健康又开心的记录,则状态字段为1+4 =5(0101).从二进
制的表示你可以很容易识别他是那些状态的叠加.

留言:John Berry

 

方法二:

根据您的描述,您希望在Access中使用Jet-SQL来实现如下查询:

select * from mytable where (字段1 & 2) =2

在SQL Server (T-SQL)中,我们可以使用 & 位操作符对二进制进行位运算,但是在Jet-SQL中,我们没有这种机制实现以上的查询。另外,如您所说的,在VBA中我们可以利用cbyte函数来返回一个数字数值的二进制值,但是在查询中,我们还是无法使用以下的语句:

select (cbyte(10) and cbyte(10)) 

因为Jet-SQL不支持这样的用法,所以无论输入值从10更改为其他数字,查询的结果始终返回 -1。


基于我对您问题的理解,我认为 John 的想法是正确的。对于您的题目,我觉得

-------------------------
表: mytable

姓名(str)   状态(byte)

abc           2
abd           1
abb           3
abe           5
abf           4
--------------------------------------

如果四种基本状态分别表示如下:

-------------------------------------
1         2          4           8

健康     工作中     开心      已领供给
---------------------------------------

然后再使用另外一个状态表来表示这其中的15种状态。例如:

表: status
---------------------------------------
状态(byte)            内容(text)
1                          健康
2                         工作中
3                         健康+工作中        
4                         开心               
5                         健康+开心          
6                         工作中+开心        
7                         健康+工作中+开心    
...........

---------------------------------------

之后我们可以查询status表来判定 "健康+开心" 所对应的状态值为5,或者也利用两个表之间的连接(诸如以下测试代码),在表mytable中查询出既健康有开心的记录是: abe     5 
-----------------------------------------------------
select * from mytable as A inner join status as B 
on a.状态 = b.状态
where 内容 = '健康+开心'
-----------------------------------------------------

留言:v-binyao

Access911.net评论:其实上述方法在 MSGBOX 对话框的参数的应用中可以体现,而且是一种不错的方法。

 

方法三:

其实,对于上述问题,我们完全可以使用JET SQL 的 LIKE 语句完成。
定义字段类型为字符串,然后用以下代码赋值:
update tableName set FieldName="0101"


在查询时使用 LIKE 语句完成
select * from tableName where FieldName like '?1?1'


 

方法四:

以下的一种方法可以说是完全否定上述3种说法:在 JET SQL 中可以使用“位与操作”符。
在 JET DB 4(Access 2000)以后的版本中,新增了一个操作符“BAnd”操作符。
但是它不能运行在 ACCESS 界面的“查询”中,却可以使用 ADO 来执行 JET SQL 代码
请看以下示例:
Function TestBAnd()
    Dim strsql As String
    strsql = "select (cbyte(10) band cbyte(10)) as newfield from 表1"
    Dim rs As New ADODB.Recordset
    rs.Open strsql, CurrentProject.Connection, 1, 1
    Do Until rs.EOF
        Debug.Print rs(0)
        rs.MoveNext
    Loop
End Function

还支持其他位操作符,比如 BXOR BNOT 等,请参考 JET SQL 4.0 的保留字

关于此主题请参考:
    新手来看:jet 4.0 的保留字《控件》
    http://access911.net/index.asp?u1=a&u2=75FABF1E10DC

留言:cg1

 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接


 

 
相关文章
     没有手动相关文章
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利