数据库的模糊查询

来源:百度知道 编辑:UC知道 时间:2024/06/17 22:35:57
数据库中存有字符串a?c。要求:查询时输入abc,adc,a1c,a2c....等等的字符也可以把a?c检索出来。也就是?可以表示任意字符。请各位赐教。
目前,验钞设备对纸币号码的识别率尚不能达到100%。如果一张纸币的号码不能被机器完全识别,那么不能识别的号码部分将用“?”代替。
例如,一张纸币号为 IG84317183 的纸币,可能由于验钞设备没有识别出其中的一位或几位数字(字母),验钞结果可能就是:
IG843171??、I?84317183 、???4317183 、IG8???7183 、IG?4317?83……
总之,“?”的位置和数量是不确定的。
我们将验出的纸币号存入数据库。当我们需要从数据库中检索该纸币号时,输入的检索数据自然是实际的纸币号,即IG84317183。
于是,问题出现了:如何使用检索数据IG84317183从数据库中把IG843171??、I?84317183 、???4317183 、IG8???7183 、IG?4317?83……
这些数据都检索出来?

明确的告诉你。。。就这么直接检索不行。。。

大家不知道看明白没有:这是用确定数据检索不确定数据。。。不是你们说的用通配符能解决的事情。

数据检索的本质是用模式(就是不确定数据),检索符合模式的确定值。

确定性就是唯一性,而模式是不确定的。。。

我们输入IG84317183的时候,这是个确定值,是唯一的。而这个唯一值可能属于的模式是无穷的或者是数量非常巨大的

从数学上来说,怎么可能用确定值用检索不确定值?

就像你说的:可能是IG8?????,而这几个问号可能的组合就有10万。也可能是I?G8431???,或者其他。

所以很简单,唯一可行的方法是倒过来,用你数据库内的内容来匹配这个确定值。因为虽然模式是不确定的,但是你数据库内储存的是有限的确定的。

首先将你数据库内的占位符“?”,替换成通配符,如果“?”只可以代表一位数则替换为“_”或者“?”本身,如果一个“?”可以代表几个字符则替换为“%”或者是“*”。因为不知道你的库规不规范,如果是规范的不知道的位数都标识为IG8???????这种,长度也都一样的话,可能就不用替换,因为?本身就是通配符(表示一位的)。因为不知道你用的是SQL SERVER,ORACLE还是其他的。

然后我们就可以用'IG84317183' 去 LIKE 你数据库里的带通配符的模式。

很简单的语句就是:

如果有表“纸币表”,字段名是“纸币号”,则:

替换为“%”的

select * from 纸币表 where 'IG84317183' LIKE REPLACE(纸币号,'?','%');

也可以替换为“_”的:
select * from 纸币表 where 'IG84317183' LIKE REPLACE(纸币号,'?','_');

如果不替换就直接: