SQL数据库怎么实现模糊查询?

SQL数据库怎么实现模糊查询?,第1张

实现的方法和详细的 *** 作步骤如下:

1、第一步,按“Ctrl  + N”创建一个SQL查询,如下图所示,然后进入下一步。

2、其次,完成上述步骤后,可以使用[create database ....]关键字来进行创建,如下图所示,然后进入下一步。

3、接着,完成上述步骤后,输入新创建的数据库的名称,如下图所示,然后进入下一步。

4、然后,完成上述步骤后,可以单击以进行分析以查看是否存在错误,如下图所示,然后进入下一步。

5、随后,完成上述步骤后,单击立即执行,可以看到限制命令已经完成,如下图所示,然后进入下一步。

6、最后,完成上述步骤后,刷新数据库,可以看到可以查询新添加的[myDb]数据库,如下图所示。这样,问题就解决了。

模糊查询简介

MongoDB查询条件可以使用正则表达式,从而实现模糊查询的功能。模糊查询可以使用$regex *** 作符或直接使用正则表达式对象。

$regex *** 作符的介绍

MongoDB使用$regex *** 作符来设置匹配字符串的正则表达式,使用PCRE(Pert Compatible Regular Expression)作为正则表达式语言。

regex *** 作符

{<field>:{$regex:/pattern/,$options:’<options>’}}

{<field>:{$regex:’pattern’,$options:’<options>’}}

{<field>:{$regex:/pattern/<options>}}

正则表达式对象

{<field>: /pattern/<options>}$regex与正则表达式对象的区别:

在$in *** 作符中只能使用正则表达式对象,例如:{name:{$in:[/^joe/i,/^jack/}}

在使用隐式的$and *** 作符中,只能使用$regex,例如:{name:{$regex:/^jo/i, $nin:['john']}}

当option选项中包含X或S选项时,只能使用$regex,例如:{name:{$regex:/m.*line/,$options:"si"}}

$regex *** 作符的使用

$regex *** 作符中的option选项可以改变正则匹配的默认行为,它包括i, m, x以及S四个选项,其含义如下

i 忽略大小写,{<field>{$regex/pattern/i}},设置i选项后,模式中的字母会进行大小写不敏感匹配。

m 多行匹配模式,{<field>{$regex/pattern/,$options:'m'},m选项会更改^和$元字符的默认行为,分别使用与行的开头和结尾匹配,而不是与输入字符串的开头和结尾匹配。

x 忽略非转义的空白字符,{<field>:{$regex:/pattern/,$options:'m'},设置x选项后,正则表达式中的非转义的空白字符将被忽略,同时井号(#)被解释为注释的开头注,只能显式位于option选项中。

s 单行匹配模式{<field>:{$regex:/pattern/,$options:'s'},设置s选项后,会改变模式中的点号(.)元字符的默认行为,它会匹配所有字符,包括换行符(\n),只能显式位于option选项中。

使用$regex *** 作符时,需要注意下面几个问题:

i,m,x,s可以组合使用,例如:{name:{$regex:/j*k/,$options:"si"}}

在设置索弓}的字段上进行正则匹配可以提高查询速度,而且当正则表达式使用的是前缀表达式时,查询速度会进一步提高,例如:{name:{$regex: /^joe/}

上面介绍的元字符可能就会让我们在查询的时候出现一些问题,比如有时候想要查询出所有带价格的模糊商品的时候用了.元字符进行模糊搜索,这时候会查询出来全部的数据;

这个时候就需要对模糊查询的条件进行一些 *** 作,转义一下:

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

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

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

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

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

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

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

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

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

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

很简单的语句就是:

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

替换为“%”的

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

也可以替换为“_”的:

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

如果不替换就直接:

select * from 纸币表 where 'IG84317183' LIKE 纸币号

注意LIKE的两边跟我们平时用的是反的(一般来说是 字段 like '某个值',现在是 '某个值' like 字段,也就是说将字段中的值作为通配符表达式 )。就这样,很简单,很简单就能实现。只要你把道理想通。

但是,请你注意:这样检索出来的东西不能保证对应。还是那个道理,模式实际上是不确定的,虽然你可以数据库中检索出来,你就能说:

IG84???183这条数据是IG84317183 ???。在现实中肯定不能,除非你在现实中有很强的业务规则对应。否则是很危险的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6801889.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存