五千年(敝帚自珍)

主题:【求助】有access的高手帮忙看看。 -- flycloud

共:💬15 🌺1
全看树展主题 · 分页首页 上页
/ 1
下页 末页
家园 【求助】有access的高手帮忙看看。

我有一个表的字段是文本类型,数据是固定位数13位的格式,我现在想通过输入一个数据查找出和其包含内容最少有10位相同的记录,应该如何查询呢?

家园 不是高手的问一下:你这十位相同是连续的还视不连续的?

比如0123456789abc对123456789cdef是否满足?

家园 不连续的也满足,

比如0123456789abc对a038569d6e721

家园 建议:用VBA的字典功能

建立一个字符串比较函数,其中用到字典对象,就容易比较出两个字符串有多少个相同的字符了。

家园 感谢回复,瓦斯给个例子说说,可别被我烦到爆炸啊,;-)
家园 一般数组用连续的整数为下标,字典的好处是可以用字符作下标

例如,你可以定义一个字符串数组dim mystr(5) as string就会得到下标从0到5的字符串数组:mystr(0)、mystr(1)、mystr(2)、mystr(3)、mystr(4)和mystr(5)。下标只能是数字的。

而使用字典,你可以把下标变成字符的,例如mystr("a")、mystr("x")、mystr("3")......

不过,对于你的问题,我想还要问一下,是否在你的字符串中有重复的字符?如果有的话,两个字符串比较的时候,重复的字符如何对待?

如果没有重复字符,问题就会简单很多,只要看两边的字典中,有几个相同的字符,用字功能典就很容易了,比字符下标要方便容易很多。

家园 【原创】使用VBA的字典功能比较两个字符串有几个相同的字符

我问题简单化了一点,重复的字符也算在内。

首先要让你的VBA具有字典功能,要在VBA中的菜单工具-引用中选择Microsoft scrpting runtime:

点看全图

然后写一个小函数,分别为两个字符串建立字典,最后比较两个字典中有几个相同的字符,在下面那个立即窗口中可以测试结果:

点看全图

当测试完成之后,可以把函数中的最后一句debug.print compString注释掉,然后就可以到你的access中调用这个函数来比较字符串了。

家园 这个比较复杂,只能简单提供一点思路

看您下面的例子,您说的这个似乎是"Pattern Matching",且让我复述一下,看看有没有误解:

输入一个字符串,含若干(>10)个单位(Unit) ,这个单位的组成,可能是单个字符,也可能是个词组。

对比一个表里的某个文本域,(A table's text field),如果这个域含有十个或以上的输入的单位,返回这个纪录。

如果是这样的话,恐怕光靠Single SQL statement不能胜任,要写脚本(Access VBA script)逐个数据来处理,关键之处在于自己要写一个字符对比的Function。

既然用Access,估计数据量不会很大,对这个Function的效率要求或许不高,应该不会那么难的。

家园 思路明白了,马上就试一试。谢谢了!
家园 我照瓦斯兄的思路搞定了。谢谢热心人。;-)
家园 补充一下,那个函数的类型定义还要更明确一点

上帖贴图中函数定义缺少了如下的红字部分,虽然也可以用,但是不够规范:

Public Function compString(str1 As String, str2 As String) As Long

我本来是写了的,因为在测试中曾经修改成sub,后来又改成function,结果后面的红字部分就忘了补回来。

家园 谁的马甲?
家园 如果数据量大的话,还可以优化一下

我的思路是最好事先把表里的字符串进行排序后另存一个字段。 然后把待比较的字符串也排序后,在表内进行对比。算法上做一些优化,比如判断哪些条件下不可能存在10个相同字符后直接终止比较。

这样我想速度会提高很多。

家园 还好数据量不大,已经没问题了。呵呵
家园 不改也可以用,谢了
全看树展主题 · 分页首页 上页
/ 1
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河