多选择筛选查询SQL语句怎么写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多选择筛选查询SQL语句怎么写相关的知识,希望对你有一定的参考价值。

我现在实现这个筛选查询呢?筛选的数据我都存在一个字段里面,怎么实现,多选不同选择怎么筛选出存在一个字段里面的匹配的数据呢?数据库用到是mysql,我用IN( )函数,这个是一个查询多个,也用过FIND_IN_SET()函数,这个是多个查询单个,都不行,请大神指教。

我做过类似的查询,就是用字典项表的数据id列,与数据表的字符串列做instr比较,比较时,两个数据分别在前后加\',\',防止第一个和最后一个字典项无法查找出来。
举个例子,数据表

字典表 dict
id name
12 wifi
13 冰箱
14 洗衣机
15 电视

业务表 query_table
id query_str
1 12,13,14,15
2 12,14
3 14,15

SELECT *
FROM dict a,query_table b
WHERE INSTR(CONCAT(CONCAT(\',\',b.query_str),\',\'), CONCAT(\',\', CONCAT(a.id,\',\')))>-0 AND b.id=1


看实际效果

参考技术A 看你的选择感觉上应该是“选择的全部”,比如,我选了wifi,餐桌,麻将机,那么就必须这三个都有,其他的有或没有不重要,重要的是这三个,也就是说“选择的全部”。
方法想到了三个:
(1)用like+and,无非是 字段 like '%15%' and 字段 like '%17%' and ……,有多少个选择写多少个like,然后根据传进来的参数截取(这部分最好是应该是前台完成,当然写成过程也可以),然后再导入数据库查询。(这个重复查询多,估计效率不会太快)
(2) 直接like也可以,只是这种需要临时拼凑语句,前面的select不说,where后面是:字段 like '%15%21%31%……',把数字中间填上%,这部分要么改变语句传输的间隔符号,要么做一下替换. (个人比较推荐这种方式,但是这种方式要注意排序,顺序是不能乱的,否则查不出来)
(3)你说的in应该不行,至少我不会,但是FIND_IN_SET可以考虑,和like+and差不多,只是又多了一层判断,而且会出现大量的"不等于0",个人觉得并不会十分好用。
参考技术B 数据库操作用什么?如果是用mybatis的话可以写循环一个一个遍历,如下:
<!-- 注意返回的数据类型是集合中保存的数据类型 Employee-->
<select id="getEmpsByConditions" resultType="com.jas.mybatis.bean.Employee">
SELECT * FROM t_employee WHERE id IN
<!--
collection:指定要遍历的集合
item:取出当前集合中元素,赋给 item 中的值
separator:遍历出的多个元素之间用什么分隔符分隔开
open:遍历集合前用什么字符进行拼接
close:遍历集合后用什么字符进行拼接
在 foreach 标签中还有一个属性 index,
遍历集合的时候 index 表示的是当前元素的索引,item 对应索引中的值
遍历 map 的时候 index 表示的是当前 map 中的 key,item 是 key 对应的 value
-->
<foreach collection="list" item="empId" separator="," open="(" close=")">
#empId
</foreach>
</select>
如果是其他的就在实现层进行遍历。
参考技术C 用行列转换吧把fac这字段拆分为多行数据,或者用存储过程执行动态sql比如
begin
declare @t nvarchar(100),@sql nvarchar(100);
set @t= (select '1,2,3,11,12,13' as c)
set @sql='select * from (
select ''1,2,3,11,12,13'' a,''1'' b
union all
select ''21,22,23,4,5,6'' a,''2'' b ) t1'
execute(@sql+' where ''1'' in ('+@t+')')
end
这个只是例子,根据实际情况改用,在sql sever中有个xml可以进行行列转换拆分的。mysql没有研究过
参考技术D 一个字段的筛选条件用模糊查询就行了,你字段里的数字都是排序的,可以用like
比如facilities like '%条件值1%条件值2%条件值3%'

SQL多个条件查询语句

设计了一个如图的查询项
如只填写地类编码(DLBM),则只搜索DLBM,其他不搜索
如果填写了多项(如地类编码DLBM和地类名称DLMC),则搜索DLBM and DLMC
想知道有什么语句能够实现这个功能么?就是将非空的textbox才作为搜索项
个人编程水平较差..只能想到用if 语句进行排列组合判断,感觉非常繁琐,效率也很低
所以特来求助

1、首先我们打开电脑里的SQL打开一个数据库。

2、然后我们点击界面上方菜单栏里的表选项打开数据库的一张表进行查询。

3、然后我们选择表右上角的加号键。

4、然后我们在编辑器中输入如图所示代码进行数据查询。

5、然后我们点击运行查看运行结果。

6、多条件查询最终结果如图所示我们可以看到多条件查询语句成功。

参考技术A Declare @DLBM nvarchar(255),@DLMC nvarchar(255)
set @DLBM='查询内容'
set @DLMC='查询内容'
select  * from 表名称 where DLBM=@DLBM and len(@DLBM)>0
union
select  * from 表名称 where DLMC=@DLMC and len(@DLMC)>0
.......拼接全部条件追问

编译出现以上错误..应该是SQL语句错误..麻烦请看下哪里应该修改

追答

你写的不对,不是给你定义了变量嘛,把数据放在
set @DLBM='查询内容'
set @DLMC='查询内容'

你的语法问题
两个SQL 拼 union 两头 都不需要分号,只要空格就可以

追问

这是在c#中调用的啊,变量在之前定义过了..
就是不知道C#中SQL语句具体怎么写

追答

string Sql="select * from dltb where 1=1 ";
if( DLBM.Length>0)
Sql+=" and DLBM='"+DLBM+"' ";
if( TBBH.Length>0)
Sql+=" and TBBH='"+TBBH+"' ";

本回答被提问者和网友采纳
参考技术B 你都用在一张表里面嘛追问

是来自同一张表的数据

追答

你可以这样写 select * from table where DLBM like ‘%+“DLBM”+%’ and DLMC like ‘%+“DLMC”+%’ and ·······但是影响查询效率。

以上是关于多选择筛选查询SQL语句怎么写的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句where多条件查询怎么写?

SQL语句where多条件查询怎么写

sql语句包含怎么写

两表关联查询SQL语句的,要怎么写?

当查询条件不确定的时候,怎么写SQL 语句

在oracle数据库中的分页SQL语句怎么写?