能否用一个字段表示集合?(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
比如有一个字段,它可能是a,b,c,d,e,f的组合(整型数据).
 
a=1,b=2,c=4,d=8,e=16,f=32,这样编码可否?
 
不行,要连续的,或者说是"无序"的.
 
不太明白,比如:
0 - {}
1 - a
2 - b
3 - a,b
4 - c
5 - a,c
6 - b,c
7 - a,b,c
8 - d
.....
应该是连续的吧。
 
补充:
1.也不一定是整型,什么类型都可以.
2.sql server 7.0
 
这样硬性编码不好,因为这个集合是要由用户进行调整的,比如删除/添加
 
...我再想想,先下网了。
 
另一种方案:用 VARCHAR(n) 或 CHAR(n) 类型, 串长度固定。
A,B,C,D,...在串中的位置是固定的,若集合中没有该元素,则该位置为空格。
例如:
" " - {}
"A " - a
" B " - b
"AB " - a,b
" C " - c
"A C " - a,c
" BC " - b,c
"ABC " - a,b,c
" D" - d
....
 
如果删除集合中一个元素,怎样处理?
比如某条记录的该字段值为 'ABC',现在我删除了元素B,怎样更新该字段值?
不能一条一条更新的,因为记录很多.

sql server有没有能类似pos,copy的字符串函数?
 
如果知道集合类型在内存中的表达方法,可以用BLOB来存放。可是我不知道。可以
找编译原理来看看。TBLOBStream.ReadBuffer和WriteBuffer。
如果你是想定义操作权限的话,可以不用集合;其实集合并不好用,因为它的数据
结构和表达不规定。我采用TStrings和BLOB来定义权限。比如,某人有‘删除’的
权限,则在他的TStrings中Add('删除=1')。用TStrings.Value('删除')='1'来
判断。因为操作权限的类型不会很多,少于1000吧,用TStrings来处理不慢。
 
我也曾经遇到同样问题。我用A;B;C记录,不过因为记录比较少,更新时记录不进行
变动,用的时候再判断,然后提供一个类似整理数据的功能,把删除的从字段中去掉。但是感觉很不high.我也想知道
 
如果删除集合中一个元素,怎样处理?
把 'B' 替换为空格,用 Replace 函数更新:
UPDATE TableName SET FieldName = Replace(FieldName, 'B', ' ')

sql server有没有能类似pos,copy的字符串函数?
哈哈,大侠应该知道吧:
CharIndex 相当于 Pos
SubString 相当于 Copy。
 
谢谢你Croco,现在应该可以解决问题了.

我的数据库很苯的. :-)
 
后退
顶部