sql一列有多值查询,根据多个只查询我想要的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql一列有多值查询,根据多个只查询我想要的数据相关的知识,希望对你有一定的参考价值。

这是我的数据库表
propertyNameID = 41 propertyValueID =1
propertyNameID = 42 propertyValueID =3
propertyNameID = 43 propertyValueID =5
propertyNameID = 44 propertyValueID =8
要查询满足这几个条件的 sonItemID。
这是我写的sql,但是这种sql太复杂了,用了太多的 inner join。
希望有更好的sql写法

个人认为两种办法
(1)每一个条件查询一次,然后取交集。oracle中通过INTERSECT实现。和union的用法一样。其他的数据库我就不知道了。
(2)我观察了一下你的数据,每个都有41,42,43,44,而后都是按照顺序排列的。
那么直接group by sonItemID,将propertyValueID字段合并,只要结果是1358的,那么就显示,否则不显示,那么就应该可以。如果害怕有的不是也进来捣乱,那么就将两个字段合并为411,423,435,448,这样就可以了,排序后合并应该就不会出现问题了。追问

给了我思路,解决了

参考技术A SELECT sonItemID  FROM 表名 WHERE propertyNameID IN (41,42,43,44) OR propertyValueID IN (1,3,5,8)

 //已改,不知道是否能满足你的需求!

参考技术B select sonItemID from 表名 where propertyNameID in (41,42,43,44) and propertyValueID in (1,3,5,8)追问

你这种不是差满足所有条件的,而是只要包含这几个值得就都会查出来 。
我要的sql 是满足我上面的那个条件后 只会查询出来一个sonItemID

追答

select sonItemID from 表名 where (propertyNameID in (41) and propertyValueID in (1))

or (propertyNameID in (42) and propertyValueID in (3)) or (propertyNameID in (43) and propertyValueID in (5)) or (propertyNameID in (44) and propertyValueID in (8))

多值模糊查询报表的制作

在数据查询系统中,经常会涉及到模糊查询和多值查询。对于模糊查询,我们可能都有所了解。就是根据用户在参数框中输入的关键字进行模糊匹配,这在SQL中是通过like条件实现的。而多值查询则大多是一次在参数框中输入2个以上关键词,以字符串组,整数组等形式进行参数传递,这在SQL中是通过in条件完成多值匹配的。

但是用户的需求往往是无止境的!最典型就是把这两种好使的方法结合起来,也就是两种查询的结合–在参数框中输入多个关键字,根据多个关键字进行模糊查询。比如,用户要根据产品名称进行多值模糊查询,当输入为“奶酪,糖”时,希望找出产品名称中含有奶酪或糖的产品列表,如下图所示:

技术分享图片

为了程序猿哥哥可以早日跟加班say goodbye , 不再做单身汪(咦?为什么我这么热心?),让我们一起了解一下润乾报表是怎么做到两种查询的完美结合的……

一共需要……1、2、3、4步:

1.定义主表模板:

技术分享图片

其中
1-3行设置行属性为报表头,其余行为数据区即可。

B3单元格表达式为:=macro1,目的是显示查询条件的拼接结果,以便校验最终数据是否正确。

A5单元格表达式为:=ds1.select(产品ID),目的是取数ds1结果集中所有的产品。

B5-F5 单元格表达式为:=ds1.字段名称,目的是根据前面的产品编号取出对应的产品信息

2.定义参数:

技术分享图片

其中
cpmc是普通参数,就是用户填入的查询值;

macro1是动态参数,根据cpmc拼接查询条件,值表达式为:if(cpmc == null or cpmc==””,”1=1″,”产品名称 like ‘%”+replace(@cpmc,”,”,”%’ or 产品名称 like ‘%”)+”%'”)。这里的动态参数,它不仅是用于在报表结果页面里面显示查询条件的拼接结果,而且也用于对sql进行数据筛选。

再详细说明一下:当cpmc为空时,返回1=1,表示查询全部数据,否则先用字符串替换函数replace()把参数中的”,”替换为”%’ or 产品名称 like ‘%”)+”%'”(注意其中的空格),替换后的结果再和前后字符串拼接得到最终的查询条件。例如当用户输入“奶酪,糖”,那么replace的替换结果就是“奶酪%’ or 产品名称 like ‘%糖%’,再和前后字符串拼接得到最终结果为 产品名称like ‘%奶酪%’ or产品名称 like ‘%糖%’。

3.定义数据集:

技术分享图片

这里在查询条件中用到了参数的特殊用法${参数名},相当于一个占位的效果,查询时会用前面定义的动态参数内容填充到这个位置。

:第2 – 3步的设置均在主表模板中添加。

4.定义参数模板:

技术分享图片

在报表工具设计区域右侧的属性栏中将B2的单元格web变量名设置为cpmc。

Bingo,多值模糊查询就这样完美地实现了!

回顾

我们来回顾一下其中遇到的问题和解决的技巧:

1、数据集SQL实现动态取数:

使用参数的${参数名}用法

2、 查询条件为空,查询全部:

使用参数1=1的用法

3、多值匹配:

以“,”分割多个查询关键字,拼接成多个 or 相连的like条件。

最后我们发现,其实这里仅仅用了润乾报表的参数特殊用法和SQL 查询条件的拼接是不是一不小心,又双叒叕get了新技能?这样下去,用不了多久是不是就可以拒绝加班,拒绝做单身汪了,窃喜吧。

快来加入润乾大家庭,get更多快速简便的报表制作方式吧。

以上是关于sql一列有多值查询,根据多个只查询我想要的数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL:当一列有最大/计数子查询时,我可以编写多列查询吗?

减少多值连接 SQL 查询中的重复记录

sql中如何使一列中的多个重复数据只显示第一条

ASP多值多字段模糊查询分页问题

T-SQL---多值模糊查询的处理

如果另一列有重复值,sql查询用相同的值替换列