

问题:
有关查询中的“位与”问题
比如:
这样,我出题目你做做看好吗? 表: 姓名(str) 状态(byte) abc 2(0010) abd 1(0001) abb 3(0011) 注:四位分别表示如下: 0 0 0 0 健康 工作中 开心 已领供给 那么如何查询既健康又开心的记录呢? 我做了以下试验 VBA 中
而 access 的查询中输入以下代码
结果却是 -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
|
其实,对于上述问题,我们完全可以使用JET SQL 的 LIKE 语句完成。
定义字段类型为字符串,然后用以下代码赋值:
|
以下的一种方法可以说是完全否定上述3种说法:在 JET SQL 中可以使用“位与操作”符。
在 JET DB 4(access 2000)以后的版本中,新增了一个操作符“BAnd”操作符。
但是它不能运行在 access 界面的“查询”中,却可以使用 ADO 来执行 JET SQL 代码
请看以下示例:
还支持其他位操作符,比如 BXOR BNOT 等,请参考 JET SQL 4.0 的保留字
|