本发明涉及分布式计算应用领域,尤其涉及一种SQL限定查询子句生成方法和组合逻辑过滤器。
背景技术:
SQL(Structured Query Language,结构化查询语言)是一种特殊目的的编程语言,是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。同时,SQL语句可以嵌套,这使它具有极大的灵活性和强大的功能。现被广泛用于存取数据以及查询、更新和管理关系数据库系统。
目前,SQL限定查询语句的生成方法有两种方法:
第一种方式,采取字符串拼接的方式,如:用户界面上有NAME(名称),ADDRESS(地址)两个字段的查询条件,则可在程序中根据几种不同的输入状态来完成查询条件的拼接:当NAME输入不为空时,将与NAME有关的条件拼接到查询语句中;同样,当ADDRESS字段输入不为空时,则将与ADDRESS有关的条件拼接到查询语句中。
这种方式虽然执行路径较优,但编程过程复杂,特别的是查询条件中当有比较复杂的逻辑结构时,则复杂度更高;
第二种方式,采取OR(或)的方式进行,以ORACLE为例,用户界面上有NAME,ADDRESS两个字段的查询条件时,可以将SQL的WHERE子句写为:(:NAME IS NULL OR NAME LIKE:NAME)AND(:ADDRESS IS NULL OR ADDRESS LIKE:ADDRESS)。
第二种方式虽然可以简化程序代码,但会让执行路径变得非常糟糕,使索引不能得到有效利用。
技术实现要素:
(一)要解决的技术问题
为了简单且较优的生成限定查询子句,本发明提供一种SQL限定查询子句生成方法和组合逻辑过滤器,调用GetSQL虚方法获取SQL语句,调用GetParameters虚方法获取参数值,根据获取的参数值逻辑拼接获取的SQL语句,拼接出的限定查询子句的执行路径较优且实现简单。
(二)技术方案
为了达到上述目的,本发明采用的主要技术方案包括:
一种结构化查询语言SQL限定查询子句的生成方法,所述方法应用于组合逻辑过滤器,所述组合逻辑过滤器由一个或多个基础数据过滤器组成;所述基础数据过滤器,包括用于获取参数值的GetParameters虚方法和用于获取SQL语句的GetSQL虚方法;
所述方法包括:
101,调用所述基础数据过滤器所包括的GetSQL虚方法获取SQL语句;
102,调用所述基础数据过滤器所包括的GetParameters虚方法获取参数值;
103,根据获取的参数值逻辑拼接获取的SQL语句。
可选地,步骤103具体包括:
103-1,根据获取的参数值,确定获取的SQL语句输入参数的参数值;
103-2,逻辑拼接输入参数的参数值非空的SQL语句。
可选地,所述组合逻辑过滤器为与逻辑过滤器;
步骤103-2具体包括:
用AND符号拼接输入参数的参数值非空的SQL语句。
可选地所述组合逻辑过滤器为或逻辑过滤器;
步骤103-2具体包括:
用OR符号拼接输入参数的参数值非空的SQL语句。
可选地,所述基础数据过滤器为SQL过滤器。
除此之外,本发明采用的主要技术方案还包括:
一种组合逻辑过滤器,所述组合逻辑过滤器由一个或多个基础数据过滤器组成;
所述基础数据过滤器,包括用于获取参数值的GetParameters虚方法和用于获取结构化查询语言SQL语句的GetSQL虚方法;
所述组合逻辑过滤器,用于调用所述基础数据过滤器所包括的GetSQL虚方法获取SQL语句;调用所述基础数据过滤器所包括的GetParameters虚方法获取参数值;根据获取的参数值逻辑拼接获取的SQL语句。
可选地,所述组合逻辑过滤器,用于根据获取的参数值,确定获取的SQL语句输入参数的参数值;逻辑拼接输入参数的参数值非空的SQL语句。
可选地,组合逻辑过滤器为基类;所述组合逻辑过滤器的子类为与逻辑过滤器;
所述与逻辑过滤器,用于用AND符号拼接输入参数的参数值非空的SQL语句。
可选地,组合逻辑过滤器为基类;所述组合逻辑过滤器的子类为或逻辑过滤器;
所述或逻辑过滤器,用于用OR符号拼接输入参数的参数值非空的SQL语句。
可选地,所述基础数据过滤器为基类,所述基础数据过滤器的子类为SQL过滤器。
(三)有益效果
本发明的有益效果是:调用GetSQL虚方法获取SQL语句,调用GetParameters虚方法获取参数值,根据获取的参数值逻辑拼接获取的SQL语句,拼接出的限定查询子句的执行路径较优且实现简单。
附图说明
图1为本发明一个实施例提供的一种SQL限定查询子句的生成方法流程图;
图2为本发明一个实施例提供的一种类图示意图;
图3为本发明一个实施例提供的另一种SQL限定查询子句的生成方法流程图。
具体实施方式
为了更好的解释本发明,以便于理解,下面结合附图,通过具体实施方式,对本发明作详细描述。
传统的SQL限定查询语句的生成方法有两种方法:第一种方式,采取字符串拼接的方式。这种方式虽然执行路径较优,但编程过程复杂,特别的是查询条件中当有比较复杂的逻辑结构时,则复杂度更高。第二种方式,采取OR(或)的方式进行。第二种方式虽然可以简化程序代码,但会让执行路径变得非常糟糕,使索引不能得到有效利用。本发明调用GetSQL虚方法获取SQL语句,调用GetParameters虚方法获取参数值,根据获取的参数值逻辑拼接获取的SQL语句,拼接出的限定查询子句的执行路径较优且实现简单。
参见图1,本实施例提供了一种SQL限定查询子句的生成方法,该方法应用于组合逻辑过滤器,该组合逻辑过滤器由一个或多个基础数据过滤器组成;基础数据过滤器,包括用于获取参数值的GetParameters虚方法和用于获取SQL语句的GetSQL虚方法;
该方法包括:
101,调用基础数据过滤器所包括的GetSQL虚方法获取SQL语句。
102,调用基础数据过滤器所包括的GetParameters虚方法获取参数值。
103,根据获取的参数值逻辑拼接获取的SQL语句。
可选地,步骤103具体包括:
103-1,根据获取的参数值,确定获取的SQL语句输入参数的参数值。
103-2,逻辑拼接输入参数的参数值非空的SQL语句。
可选地,组合逻辑过滤器为与逻辑过滤器;
步骤103-2具体包括:
用AND符号拼接输入参数的参数值非空的SQL语句。
可选地,组合逻辑过滤器为或逻辑过滤器;
步骤103-2具体包括:
用OR符号拼接输入参数的参数值非空的SQL语句。
可选地,基础数据过滤器为SQL过滤器。
本发明的有益效果是:调用GetSQL虚方法获取SQL语句,调用GetParameters虚方法获取参数值,根据获取的参数值逻辑拼接获取的SQL语句,拼接出的限定查询子句的执行路径较优且实现简单。
本发明提供的一种SQL限定查询子句的生成方法应用于图2所示的类结构中,该类结构中包括
1、组合逻辑过滤器(CompositeLogicFilter),是所有逻辑过滤器的基类,其有个一名为ChildDataFilters的集合属性,表示组合逻辑过滤器是由多个基础数据过滤器(BaseDataFilter)组成的。
(1)AndLogicFilter,为与逻辑过滤器,是CompositeLogicFilter的子类,用于实现各个基础数据过滤器的子类的与方式的拼接。
(2)OrLogicFilter,为或逻辑过滤器,是CompositeLogicFilter的子类,用于实现各个基础数据过滤器的子类的与方式的拼接。
2、BaseDataFilter,是所有数据过滤器的基类。其包括如下两个虚方法,由BaseDataFilter的各个子类自行实现:
(1)GetParameters虚方法,用于获取数据过滤器的所有参数。
(2)GetSQL虚方法,用于获取SQL语句。
BaseDataFilter的子类为SQL过滤器(SqlFilter)和CompositeLogicFilter。
●对于GetParameters虚方法,其在SqlFilter中返回的是ParameterName。其在CompositeLogicFilter中返回的是所有ChildDataFilters的GetParameters并联后的结果;
●对于GetSQL虚方法,其在SqlFilter中返回的是SQL特性(属性)。在AndLogicalFilter中返回是ChildDataFilters中所有输入参数不为空的GetSQL方法返回值用AND符号拼接后的结果。在OrLogicalFilter中,此方法返回是ChildDataFilters中所有输入参数不为空的GetSQL方法返回值用OR符号拼接后的结果。
另外,SqlFilter中包含了一个过滤器子句,并且有一个ParameterName标识参数名称,此参数名称与GetSQL中的parameterValues中的参数名称对应,如果在parameterValues中找不到ParameterName,则可认为此SqlFilter不应当被包含在最终的SQL中。
基于图2所示的类图,以CompositeLogicFilter的子类OrLogicFilter执行SQL限定查询子句的生成方法的过程为例进行再次说明,参见图3。
301,OrLogicFilter调用SqlFilter所包括的GetSQL虚方法获取SQL语句。
302,OrLogicFilter调用SqlFilter所包括的GetParameters虚方法获取参数值。
303,OrLogicFilter根据获取的参数值,确定获取的SQL语句输入参数的参数值,用OR符号拼接输入参数的参数值非空的SQL语句。
下面再基于图2所示的类图,以CompositeLogicFilter的子类AndLogicalFilter执行SQL限定查询子句的生成方法的过程为例进行再次说明。
如果有下面的构造:
则,当:NAME参数有值,:ADDRESS为空时,最终生成限定查询WHERE子句是:
NAME LIKE:NAME
当:NAME参数为空,:ADDRESS有值时,最终生成WHERE子句是:
ADDRESS LIKE:ADDRESS
当:NAME和:ADDRESS都有值时,最终生成WHERE子句是:
(NAME LIKE:NAME)AND(ADDRESS LIKE:ADDRESS)
本实施例提供的方法中,涉及的所有过滤器都有两个公共的方法:一是获取参数列表,用于获取数据过滤器中的参数,一是根据输入参数的值获取最终的WHERE子句的方法。通过本实施例提供的方法可以拼接出执行路径优化的SQL WHERE子句。
本实施例提供的方法调用GetSQL虚方法获取SQL语句,调用GetParameters虚方法获取参数值,根据获取的参数值逻辑拼接获取的SQL语句,拼接出的限定查询子句的执行路径较优且实现简单。
基于同一发明构思,本发明还提供一种组合逻辑过滤器,该组合逻辑过滤器由一个或多个基础数据过滤器组成;
其中,基础数据过滤器,包括用于获取参数值的GetParameters虚方法和用于获取结构化查询语言SQL语句的GetSQL虚方法;
组合逻辑过滤器,用于调用基础数据过滤器所包括的GetSQL虚方法获取SQL语句;调用基础数据过滤器所包括的GetParameters虚方法获取参数值;根据获取的参数值逻辑拼接获取的SQL语句。
可选地,组合逻辑过滤器,用于根据获取的参数值,确定获取的SQL语句输入参数的参数值;逻辑拼接输入参数的参数值非空的SQL语句。
可选地,组合逻辑过滤器为基类;组合逻辑过滤器的子类为与逻辑过滤器;
与逻辑过滤器,用于用AND符号拼接输入参数的参数值非空的SQL语句。
可选地,组合逻辑过滤器为基类;组合逻辑过滤器的子类为或逻辑过滤器;
或逻辑过滤器,用于用OR符号拼接输入参数的参数值非空的SQL语句。
可选地,基础数据过滤器为基类,基础数据过滤器的子类为SQL过滤器,且基础数据过滤器的子类为组合逻辑过滤器。
本实施例提供的组合逻辑过滤器调用GetSQL虚方法获取SQL语句,调用GetParameters虚方法获取参数值,根据获取的参数值逻辑拼接获取的SQL语句,拼接出的限定查询子句的执行路径较优且实现简单。