欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL字段的被包含查询

程序员文章站 2022-06-14 21:53:59
前言 说到sql的模糊查询,最先想到的,应该就是like关键字。 当我们需要查询包含某个特定字段的数据时,往往会使用 ‘%关键字%’ 查询的方式。例如: select ....

前言

说到sql的模糊查询,最先想到的,应该就是like关键字。
当我们需要查询包含某个特定字段的数据时,往往会使用 ‘%关键字%’ 查询的方式。例如:

select ... from 表名 where 字段名 like '%关键字%'

这应该可以算是一种典型的”包含xxx”的方式,但如果我们需要查询字段被包含于特定字符的数据时呢?

比如,我有一张联系人数据表connectname,其中有个字段用于记录姓名name。我想获取名为小兰和灰原的人的联系资料。正常情况下,我们首先能想到的做法应该是:

select * from connectname 
where 
    name = '小兰' 
    or name = '灰原'

这样的做法是可以实现这种目的的。如果这时候,我突然想,再查一个人,比如说“柯南”,那么我们就要修改sql的结构,添加一个where条件句:

select * from connectname  
where 
    name = '小兰' 
    or name = '灰原'
    or name = '柯南'

我们知道,or条件查询本身是属于效率较低的,而且结构变动的语句在mybatis实现稍微麻烦些(当然也是可以实现的,遍历插入字段就行了)。
能不能简单一些呢?我可以把所有关键字放在一起,只用一个where条件去实现吗?


charindex登场

这时候,我们就可以用 charindex 关键字了,charindex可以返回某个字段在一串文字中出现的位置,跟string的indexof用法类似,不多废话,我们来举个栗子:

charindex('李白','曹操很帅') =0

在上面的栗子中,因为曹操很帅不包含李白关键字,所以找不到,返回0.

charindex('李白','李白很帅') =1

同样的栗子,因为包含里李白关键字,会返回关键字所在的开头第一个字的索引,所以返回1.

了解了使用方法之后,我们就可以运用charindex关键字优化下我们的sql语句:

select * from connectname  
where 
    charindex(name ,'小兰灰原柯南')>0

如果name字段对应的名字在 ‘小兰灰原柯南’ 中出现,那么charindex函数就会返回大于1,就可以得到我们想要的数据啦(他们3个人也可以在一起愉快的玩耍咯^-^)
对应的mybatis实现也相对简洁

select * from connectname  
where 
     0 ]]>

如果后期我们想要加入一个新的人,比如毛利小五郎,只需要在传入的参数中加入 ‘小兰灰原柯南毛利小五郎’ 就可以了,是不是简单了许多呢?