多条件组合查询

2024-10-12

多条件组合查询(精选4篇)

多条件组合查询 篇1

摘要:在实际Web应用开发中,几乎所有的应用程序都需要数据库支持。通过对数据库的查询可获得特定的数据。多件组合动态查询算法的优劣决定了查询处理的响应时间,设计高效合理的查询方法非常必要。以应用实例为基础,结合数据库理论,设计实现了两种查询算法。

关键词:存储过程,组合查询,参数化,Web应用

随着网络信息技术的发展和深入, 基于Web和数据库架构的应用系统已经成为主流架构, 部署在Web上的业务系统应用越来越广泛。Web应用在开发中, 多条件组合查询是应用必不可少的功能之一, 由于涉及大量数据在网络上的传输,因此查询处理和优化就成为提高系统性能的关键因素。查询处理和优化就是通过合理的算法尽量减少通信的信息量, 从而提高查询的响应时间性能以及减少系统开销。讨论以Microsoft ASP.NET平台下C# 语言和SQL Server2005为开发环境, 对多条件动态组合查询方法进行充分研究。

1 表结构

这是在HR管理项目中的一个会员信息表中抽取而来的一个具有代表性的表结构, 表1描述了表结构中各类所描述的含义。

2 信息查询

在实际应用中, 这种对会员信息的检索往往是多种模糊条件组合在一起进行查询, 例如查: 姓名: 张民族: 汉, 家庭地址: 劳动路, 等。这种不确定的查询信息有的是通过文本框输入, 有的通过下拉框选择, 如民族, 部门等信息, 之后把名称转换成与名称对应的代码进行查询。

2.1 查询方法一

查询方法一主要特点是根据查询条件文本框输入值拼接SQL语句 , 采用参数化的 方式进行拼 接 , 是为了避免SQL的注入, 代码结构清晰易懂。

2.2 查询方法二

2.2.1 创建存储过程

2.2.2 创建存储过程

2.2.3 创建存储过程

以上这3个存储过程都是完成模糊查询功能, 效率相近,只是程序代码略有不同, 在实际项目中都用过, 根据读者的喜好, 可自行选择。

在SQL Server Management Studio查询窗口中, 可用如下调用方式进行测试。

这3个查询都是查询李姓1972年出生的人, 查询结果如图1所示。

2.3 页面端的查询代码:

2.4 直接调用存储过程的优点

查询方法二使用存储过程, 相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下优点:

(1) 减少网络通 信量。

(2) 执行速度 更快。在 存储过程创 建的时候 , 数据库已经对其进行了一次解析和优化。 其次, 存储过程一旦 执行 ,在内存中就会保留一份这个存储过程, 这样下次再执行同样的存储过程时, 可以从内存中直接调用。

(3) 更强的适 应性 : 由于存储过 程对数据 库的访问是 通过存储过程来进行的, 因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动, 而这些改动不会对应用程序造成影响。

3 结语

随着互联网技术的迅猛发展, 关键业务越来越多地基于Web应用 , 多种查询 功能的设 计与实现 在数据库 管理系统中, 查询扮演着重要的角色。设计实现了常用两种实用查询算法, 在实际项目中这两种方法应用在不同场景下, 可根据实际情况加以选择, 在实际应用中取得很好的效果, 供读者借鉴采用。

多条件组合查询 篇2

PowerBuilder是一款优秀的数据库系统前端用户应用程序开发工具[1],它所独有的专利技术———智能对象数据窗口功能十分强大[2],是PowerBuilder为操作关系数据库数据而提供的数据操纵对象。通过数据窗口,可以对数据库进行检索、查询、插入、删除和更新等各种操作。本文以笔者编写的“大型综合性医院医疗设备管理信息系统”为例,详细介绍了通过PowerBuilder的数据窗口技术实现多条件组合查询的方法。

2 语法运用

数据库查询的实质是数据过滤,数据窗口使用2个过滤函数setfilter()和filter()分别完成过滤条件设置和执行数据记录的过滤显示。setfilter(format)函数定义数据窗口控件的过滤条件。其中format为过滤条件表达式,是一个字符串,它的值是由列名或列号、关系操作符以及要比较的值组成的逻辑表达式。filter()函数使用数据窗口当前的过滤条件过滤数据窗口中数据。函数执行后,数据窗口只显示满足过滤条件的数据。

通过PowerBuilder的编程语言PowerScript提供的IF..THEN条件语句编写程序代码,结合上述2个函数的应用,可以实现多个查询条件的任意方式选取组合。多行IF..THEN语句的语法格式为[3]:

其中,condition1、condition2是逻辑表达式。action1、action2、action3是一条或多条语句,方括号表示该子句可根据需要选择。

3 查询条件设置

3.1 数据表与数据窗口建立

在数据结构设计中,把医疗设备信息分为静态信息和动态信息2种。设备整个寿命周期中只需一次记录的信息视为静态信息,包括设备固有属性(如名称、型号、机身号)以及入库、出库、验收、报废等;其他如维修、计量、档案等则归为动态信息。所有静态信息全部归纳进一个名称为productinfo的数据表中。创建数据窗口dw_productinfo,显示风格为列表样式,数据源选择SQL Select数据源,显示列从productinfo表中选取需要显示的字段,列的数量要照顾到屏幕的显示宽度。

3.2 查询目的

根据医疗设备信息查询的一般习惯,选择数据表中的“使用科室”、“设备价值”、“启用日期”3个字段作为查询字段,对这3类信息进行精确检索,即可以单个查询条件检索,也可以任意2个或3个组合查询条件检索。

3.3 查询条件设置

“设备价值”和“启用日期”的比较值从单行编辑框输入,比较方式从下拉列表框选取,有“>=”和“<=”2个列表项。

“使用科室”的比较值从下拉列表框选取,比较方式默认为“=”。下拉列表框的列表项Item是数据表“productinfo”中出现的所有科室名称,通过下面几个步骤自动获取和更新:

(1)创建数据窗口dw_department

它的数据源是对表“productinfo”中科室字段取非重复值,程序代码如下:

(2)创建存储过程d_dept

程序代码如下:

(3)把d_dept检索到的科室名称赋给ddlb_1

程序代码如下:

4 窗体设计

创建Windows窗口命名为w_browse(见表1)。这个窗口的基本功能是全部设备信息浏览,用户查询界面也建立在这个窗口上,其作用是按照用户选择的查询条件检索想要浏览的那部分医疗设备。窗口中包含与查询操作直接相关的控件如表1所示,其中设置“返回”按钮的功能是清除下拉列表框和单行编辑框中的查询条件,并使窗口回到初始状态,以备下一次查询。

5 编写控件脚本

(1)cb_1按钮的clicked事件

6 结束语

查询功能是几乎所有数据库应用软件必不可少的重要功能,良好的查询设计要求有合理的查询条件、方便的查询界面和快速高效的实现代码。本文所介绍的查询方法适用于在大量记录中检索出感兴趣的一组记录、且查询字段数不多的情况,一般不超过3个,过多的查询字段在编写定义查询条件代码时,if…then嵌套会过于复杂。

摘要:目的:通过PowerBuilder数据窗口技术实现信息浏览窗口的数据记录检索,要求满足任意组合的一至数个查询条件。方法:确定查询字段,通过If...Then条件语句编写查询条件组合,使用数据窗口函数setfilter()和filter()执行满足查询条件的数据检索。结果:在信息浏览窗口建立了方便灵活的查询功能。结论:基于数据窗口过滤函数的查询方法适用于查询字段数不多、需要在大量记录中检索出多条记录的情况。

关键词:PowerBuilder,数据库,查询

参考文献

[1]费军,潘晓东,金美娟,等.PowerBuilder下医院消耗品超市化管理设计与实现[J].医疗卫生装备,2007,28[12]:37-38.

[2]费军,潘晓东,蒋元林,等.医院战备物资管理系统的开发与研制[J].医疗卫生装备,2008,29[1]:52-54.

多条件组合查询 篇3

1 动态多条件查询方法的分析研究

在数据库应用程序研发的软件过程中,经常涉及到对数据库中一个或多个数据表的多个字段进行任意形式组合查询,这就是动态多条件查询。在这样的查询界面或网页中,用户可以根据自己已知的多个条件信息在数据库中进行搜索,通过已知的条件筛选数据,缩小搜索范围,从而得到所有符合要求的结果。当前的动态多条件查询方法可以分为查询条件枚举法、SQL语句比较拼接和改进的SQL语句拼接3种。为了论述方便,设在某物流信息管理

系统数据库中存在一张材料表(Tb_Material),包含6个字段,该表各字段的基本信息如表1所示(数据类型基于SQL Server)。

1.1 查询条件枚举法

查询条件枚举法的思想比较简单,其出发点为针对不同的查询条件组合形式列出与之对应的SQL语句,最终执行的SQL语句只是其中的一条。以材料代码(Snum)和材料名称(Sname)2个查询条件为例,源程序如下(采用C#语言,下同。其中txtSnum、txtSname为系统查询界面或页面的文本框,用以输入材料代码和名称,@Snum、@Sname分别为接收输入的材料代码与名称的参数,sqlStr为最终执行的SQL语句):

容易发现,对于2个条件的动态查询,源程序中出现4次条件判断和4条查询语句。对于3个条件的动态查询,将出现8次条件判断和8条查询语句。以此类推,若将材料表(Tb_Material)的6个字段全部纳入查询条件中,将出现64次条件判断和64条查询语句。因此,在查询条件枚举法中,条件判断次数或查询语句的条数Y与查询条件的个数X的函数关系式满足:Y=2X。当查询条件的个数增多时,程序代码的复杂性大大升高,其执行效率也将急剧下降。

1.2 SQL语句比较拼接

为了克服枚举法的缺点,在程序中定义两个字符串:string sqlStr="select*from Tb_Material where";string oldSqlStr="selec*from Tb_Material where";oldSqlStr作为参照字符串,sqlStr作为最终执行的SQL语句。源程序如下:

SQL语句比较拼接以参照字符串oldSqlStr为基准,先逐一对各查询条件作出判断,若查询条件非空,则将查询条件拼接到sqlStr后面,将sqlStr与oldsqlStr进行比较是为了确定此次拼接是否为第一次拼接。若为第一次拼接,则说明即将在sqlStr后面加入第一个条件语句。若非第一次拼接,则说明将在sqlStr已有的条件语句后面通过“and”增加新的条件语句。可以发现,较查询条件枚举法而言,对于查询条件个数≥3的动态查询,只需增加少量相似的代码,源程序的条件判断次数与查询语句的条数将大大缩减,在很大程度上提高了程序代码的执行效率。

1.3 改进的SQL语句拼接

SQL语句比较拼接采用两个字符串,对于每个非空的查询条件,都要将sqlStr与oldsqlStr进行比较以确定当前的拼接是否为第一次拼接。并且,在对所有的查询条件都作出判断之后,仍需将sqlStr与oldsqlStr进行最后的比较,用以避免因所有的查询条件均为空而导致SQL语句出错。为了消除这种重复的比较,可以在where子句中预先设定一个恒定成立的条件。改进的SQL语句拼接源程序如下:

与SQL语句比较拼接对比,改进的SQL语句拼接无论是在代码量还是在编程技巧上都上了一个台阶。通过在sqlStr的where子句中预先设定一个恒定成立的条件''='',只要对每个查询条件逐一进行非空判断,就可以进行无限制的SQL语句自然拼接,从而较好地实现动态查询。

2 通用动态多条件查询方法的实现

通过对查询条件枚举法、SQL语句比较拼接和改进的SQL语句拼接3种动态多条件查询方法的分析研究可知,对比枚举法和SQL语句比较拼接两种方法,改进的SQL语句拼接在执行效率上明显占优势,能够带来整个数据库应用系统性能的提高。然而,美中不足的是,纵观这3种方法,始终没有得到改进的是源程序中繁琐的条件判断,即If语句。而对于程序优化,起到条件判断作用的If语句是编译器优化代码的最大障碍。程序代码中的If语句越多,其执行速度和效率越低。因此,可以考虑在改进的SQL语句拼接基础之上,通过对源程序中繁琐的If语句作进一步的改进,从而找到一种更加高效灵活的动态多条件查询方法。

改进的SQL语句拼接通过在where子句中预先设定一个恒定成立的条件''='',从而较好地实现了SQL语句的自然拼接。考虑到在其最终执行的SQL语句sqlStr中,参数@Snum、@Sname等的值直接来自获取的用户在相应文本框、下拉列表框等组件中输入或选择的值,在应用程序运行之前,这些参数的值的非空与否不能确定。但可以确定的是,这些参数的值只有两种状态:空或非空。这两种状态具有对立性。而在SQL语句的where子句中,可以采用“or”逻辑运算符连接两个条件,将同一个参数的这两种状态都表征出来。对照前文阐述的内容,以参数@Snum为例,可以表示为:Snum like'%'+@Snum+'%'or@Snum=''。如果参数@Snum的值非空,则@Snum=''条件不满足,整个条件表现为Snum like'%'+@Snum+'%';如果参数@Snum的值为空,@Snum=''条件满足,即''='',这是一个恒定成立的条件,则Snum like'%'+@Snum+'%'条件“失效”,整个条件表现为''='',恒定成立。

因此,上文中的源程序可以作如下的进一步优化:

容易发现,在优化的SQL语句中,where子句中“and”逻辑运算符所连接的每个圆括号内的条件均包含采用“or”逻辑运算符连接两个条件,将各参数的两种状态都表征出来了。当所有参数的值均为空时,最终执行的SQL语句sqlStr等效为:

亦等效为:

这样,无论查询条件个数的多少,该SQL语句均可以自动地根据各参数的值进行条件匹配。经过优化,在改进的SQL语句拼接基础之上,巧妙地消去了源程序中繁琐的If语句,无需对每个查询条件逐一进行非空判断,便可进行无限制的SQL语句自然拼接,从而实现了简洁方便、高效灵活的动态多条件查询。

从优化技巧上看,该方法巧妙地利用了where子句中“or”与“and”两种逻辑运算符,结合各参数的空与非空两种相互对立的状态,对where子句的结构进行了重组,从而达到了预期效果。同时,为了使系统更加高效地进行动态多条件查询,可以运用该方法创设相应的存储过程。上文中的源程序对应的存储过程如下(设系统查询界面或页面中包含“材料代码”、“材料名称”、“单位名称”、“价格上限”、“价格下限”、“库存地”及“入库时间”7个查询条件):

存储过程“Pr_GetMaterial”包含7个参数,其中,参数@HighPrice与@LowPrice分别表示材料的价格上限与价格下限,它们的默认值均设定为-1,以保证当用户在系统查询界面或页面中没有指定材料的价格上限或价格下限时,@LowPrice=-1或@HighPrice=-1恒定成立,使得存储过程能够正常执行。存储过程经过编译后存储在数据库中,通过数据库应用程序的调用执行,可以减少预处理所花费的时间,从而提高系统的执行效率。

3 结束语

文章着眼于数据库应用程序性能的提高,以SQL语句查询优化为出发点,对当前的动态多条件查询方法进行了探究与对比分析,提出了一种高效通用的动态多条件查询方法。采用该方法形成的SQL语句及程序代码简洁灵活,降低了算法的复杂度,能够在很大程度上促进系统性能的提高。

参考文献

[1]朱更明,李方敏,李和军.基于数据库系统表的通用查询方法[J].计算机工程与应用,2001(24)

[2]邵增珍,刘弘,刘磊.支持重用的可视化通用查询界面的生成[J].计算机工程,2003(9).

[3]刘桂芝.浅谈SQL语句的优化对应用程序性能的影响[J].一重技术,2007(1).

[4]吴险峰.SQL Server环境下的SQL优化方法探讨[J].电脑知识与技术,2008(15).

[5]姚剑芳.基于SQL Server的多条件模糊匹配查询[J].福建电脑,2010(4).

多条件组合查询 篇4

关键词:数据库,SQL Server,模糊查询,通配符,递进法,枚举法

0、引言

数据库信息查询是任何通用数据库管理系统的必备的主要功能之一, 也是开发成功与否的重要组成部分。在开发数据库应用时, 应该容许用户按照多种方式对数据库的任意字段进行组合来查询信息。如何设计灵活、方便、高效实用的查询系统一直是众多开发者所关注的问题。本文在SQL Server的实践应用中总结出一种行之有效的方法, 即多条件模糊匹配查询, 可将该方法应用于B/S、C/S模式的系统中的搜索引擎的构建。

1、单条件模糊匹配查询

在进行数据库查询时, 有完整查询和模糊查询之分。一般模糊查询语句如下:

SELECT字段FROM表WHERE某字段Like条件

其中关于条件, SQL提供了四种匹配模式:

%:表示任意0个或多个字符。可匹配任意类型和长度的字符。

_:表示任意单个字符。匹配单个任意字符, 它常用来限制表达式的字符长度语句:

[]:表示括号内所列字符中的一个 (类似正则表达式) 。指定一个字符、字符串或范围, 要求所匹配对象为它们中的任一个。

[^]:表示不在括号所列之内的单个字符。其取值和[]相同, 但它要求所匹配对象为指定字符以外的任一个字符。

在此处要实现搜索如"姓名"、"地址"之类的字段的模糊查询, 应该正确巧妙地使用"%"。比如要根据输入的部分姓名来查找学生的基本信息, 如查找"张小明", 可以输入"张"、"小"、"明"、"张明"、"小明"等等。这里输入的部分姓名可以多种多样, 一一分析不同的情况, 如输入"张"、"小"、"明"这样的单字的搜索条件的, 我们很容易就可以写出其SQL语句:如SELECT*FROM users WHERE username LIKE&apos;%明%&apos;;但是如果用户输入"张明"、"小明", 以上的语句就不再符合条件了, 正确应该是SELECT*FROM users WHERE username LIKE&apos;%张%明%&apos;和SELECT*FROM users WHERE username LIKE&apos;%小%明%&apos;。

综合以上的分析, 我们需要将用户输入的查询关键词逐个字符进行遍历, 同时为了满足模糊查询, 在每个字符之后加入通配符"%", 其流程如下图所示:

SQL源程序如下:

--@Partial Name存放输入的部分姓名

DECLARE@Search Condition varchar (200) , @Partial Name varchar (200)

如输入"张明" (即@Partial Name值为张明) , 即可搜索出同时包含"张"和"明"两个字的记录, 如表1所示:

2、多条件搜索

一般来讲, 有两种方法进行多条件搜索:枚举法和递进法。

2.1 枚举法

枚举法思路较简单一一判断条件是否为空, 再按非空条件搜索, 同时可以利用真值表技术来对付条件极多的情况。

采用枚举法的SQL源程序如下:

理解上述程序时, 着重琢磨核心部分, 4组语句一一对应了2个搜索框中的4种状态, 如表2所示:

如果增加两个搜索条件 (增加性别, 电子邮件) , 搜索的状态组合为24种, 需要16组语句。

从分析中我们可以看出, 搜索条件不太多时 (n<=3) , 适合使用枚举法, 因为枚举法的思路非常简单。而当条件增多时, 如有4个条件时就要写16组语句。很明显, 当条件增多以后, 枚举法的实现语句呈指数增长, 实现难度加大, 效率较低。

2.2 递进法

与枚举法相比它们只有核心部分不同, 递进法的搜索核心, 依次判断条件为空否, 非空则将其加入搜索条件。

如前文所述, 当有4个条件时, 采用递进法的SQL源程序如下:

--递进法的搜索核心, 依次判断条件为空否, 非空则将其加入搜索条件

递进法是一个明智的算法, 单从语句的长短就可以看出来了。这个算法的难点和精髓就在字符串连接符"+"以及设计"1=1"的条件。首先得先设计"1=1"的条件, 防止所有的搜索条件均为空的情况。其次你应该清楚"+"在SQL中就是一个字符串连接符, 把该符号左右的字符拼接在一起。当num不为空, se@Search Condition=@Search Condition+&apos;and num like&apos;&apos;&apos;+@snum+&apos;&apos;&apos;&apos;;接下来name不为空时, set@Search Condition=@Search Condition+&apos;and name like&apos;&apos;&apos;+@sname+&apos;&apos;&apos;&apos;;以此类推就可以推广到n个条件的搜索。当然当搜索条件皆为空时, 因为设计了"1=1"这个衡成立的条件, 将选择表中的所有记录。

由上分析可看出, 当查询条件增加时, 递进法的实现语句增线性递增;无论从程序的效率还是可实现性方面, 递进法明显优于枚举法。故本文使用递进法的多条件搜索结合单条件查询实现多条件模糊匹配查询。

3、多条件模糊查询的实现

综合单条件模糊查询、多条件搜索的方法, 即可实现多条件模糊查询。但是这里应该注意根据现实生活的情况, 性别字段就不需要使用like关键字。

4、在Web应用中的改进

上述方法可用于C/S系统和B/S系统中实现搜索引擎, 但是在B/S系统应用中还存在缺陷, 问题主要在于通配符%。一方面是因为人们平时习惯把*作为通配符, 另一方面%若出现在超链接中, 通过request获取时%将被"吃"掉, 如下:

在IE中浏览test.htm时点击超链接, 显示为:Testthenum。可见%直接被超链接忽略掉了。怎么才能解决这个问题呢?很简单, 我们做点小小的手脚--偷梁换柱。

将以下代码加在搜索核心之前:

将以下代码加在搜索核心之后:

在我们来分析一下这些语句。replace () 是字符串替换函数, replace (name, "*", "%") 就是将name中所有的*换成%。也就是说, 我们把3个条件中凡是出现的*都替换为%, 这样一来前3句就将通配符改成*了。而后3句就可以防止%被"吃"掉。所有问题就迎刃而解了吧。

5、结论

本文讨论的是基于SQL Server的多条件模糊匹配查询, 在查询方法的设计当中, 当要搜索如"姓名"、"地址"之类的字段时, 利用like并巧妙使用"%"来产生模糊查询。经过算法比较, 采用递进法来构建查询使用的SQL语句。此外, 还在WEB应用中改进由于通配符造成的缺陷。通过这些方法为数据库管理信息系统提供灵活、方便、有效的数据查询方法, 从而构建高效使用的搜索引擎。

参考文献

[1]周泓, 徐小良, 汪乐宇.基于模糊算法的数据库查询工具的设计[J].计算机应用研究, 2001, (5) :15~17

[2]朱蓉.基于模糊理论的查询技术研究[J].计算机应用研究, 2003, (5) :8~10, 29

[3]王佳宜, 杨路明, 谢东, 等.关系数据库上关键词的数字属性模糊查询研究[C].全国第18届计算机技术与应用 (CACIS) 学术会议论文集 (上册) , 2007:650~655

[4]张森, 韦明.数据库的模糊查询技术[J].电子与自动化, 2000, (5) :23~24

[5]张新华, 朱跃龙, 梁正和, 基于数据字典的通用动态查询系统设计与实现[J].计算机与现代化, 2006 (4)

[6]何珍文, 吴冲龙, 等.数据库应用程序中通用动态查询实现方法研究[J].计算机工程, 2002, 28 (11)

上一篇:非量化管理下一篇:巾帼标兵