发明内容
本发明的主要目的在于提供一种数据库查询语句的生成方法及装置,以解决生成数据库查询语句时准确性差的问题。
为了实现上述目的,根据本发明的一个方面,提供了一种数据库查询语句的生成方法。
根据本发明的数据库查询语句的生成方法包括:获取多个预设查询对象,其中,多个预设查询对象包括根查询对象和多个叶查询对象;从多个叶查询对象中获取目标叶查询对象;确定查询列,其中,查询列用于表示待查询内容对应的列;将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象;根据目标查询对象生成目标数据库查询语句。
进一步地,将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象包括:获取预设查询代码,其中,预设查询代码为表示查询条件的代码;将查询列、预设查询代码和目标叶查询对象添加到根查询对象中,得到目标查询对象。
进一步地,获取多个预设查询对象包括:获取预设数据库查询语句;将预设数据库查询语句按照预设规则进行拆分,获取多个拆分结果;将多个拆分结果分别作为多个预设查询对象。
进一步地,将预设数据库查询语句按照预设规则进行拆分包括:确定预设数据库查询语句的语句结构;按照语句结构,划分出预设数据库查询语句的根节点和叶节点;按照预设数据库查询语句的根节点和叶节点对预设数据库查询语句进行拆分。
进一步地,按照语句结构,划分出预设数据库查询语句的根节点和叶节点包括:将预设数据库查询语句中包含的物理表、联接表、逻辑表和子查询表作为预设数据库查询语句的叶节点;将预设数据库查询语句中的查询实体作为预设数据库查询语句的根节点。
进一步地,多个叶查询对象用于嵌套在根查询对象中,根据目标查询对象生成目标数据库查询语句包括:获取根查询对象和目标叶查询对象的预设嵌套关系,其中,嵌套在内部的查询对象先于嵌套在外部的查询对象生成目标数据库查询语句;根据预设嵌套关系和目标查询对象生成数据库查询语句。
为了实现上述目的,根据本发明的另一方面,提供了一种数据库查询语句的生成装置。
根据本发明的数据库查询语句的生成装置包括:第一获取单元,用于获取多个预设查询对象,其中,多个预设查询对象包括根查询对象和多个叶查询对象;第二获取单元,用于从多个叶查询对象中获取目标叶查询对象;确定单元,用于确定查询列,其中,查询列用于表示待查询内容对应的列;添加单元,用于将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象;生成单元,用于根据目标查询对象生成目标数据库查询语句。
进一步地,添加单元包括:第一获取模块,用于获取预设查询代码,其中,预设查询代码为表示查询条件的代码;添加模块,用于将查询列、预设查询代码和目标叶查询对象添加到根查询对象中,得到目标查询对象。
进一步地,第一获取单元包括:第二获取模块,用于获取预设数据库查询语句;拆分模块,用于将预设数据库查询语句按照预设规则进行拆分,获取多个拆分结果;确定模块,用于将多个拆分结果分别作为多个预设查询对象。
进一步地,拆分模块包括:确定子模块,用于确定预设数据库查询语句的语句结构;划分子模块,用于按照语句结构,划分出预设数据库查询语句的根节点和叶节点;拆分子模块,用于按照预设数据库查询语句的根节点和叶节点对预设数据库查询语句进行拆分。
通过本发明,采用包括以下步骤的方法:获取多个预设查询对象,其中,多个预设查询对象包括根查询对象和多个叶查询对象;从多个叶查询对象中获取目标叶查询对象;确定查询列,其中,查询列用于表示待查询内容对应的列;将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象;根据目标查询对象生成目标数据库查询语句,解决了生成数据库查询语句时准确性差的问题,进而通过将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象,再根据目标查询对象生成目标数据库查询语句,达到了提高生成数据库查询语句的准确性的效果。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本发明的实施例,提供了一种数据库查询语句的生成方法。
图1是根据本发明的数据库查询语句的生成方法的实施例的流程图。如图1所示,该方法包括步骤S102至步骤S110:
步骤S102,获取多个预设查询对象,其中,多个预设查询对象包括根查询对象和多个叶查询对象。
多个预设查询对象包括根查询对象和多个叶查询对象。根查询对象是生成的数据库查询语句的最上层的查询实体,例如,SELECT…FROM…。叶查询对象是可以添加入根查询对象中的查询实体。叶查询对象包括表,例如物理表(PhysicalTableExpression,如tableA)、逻辑表(LogicalTableExpression),如(SELECT a FROM tableA)AS T)、子查询表、联接表(JoinTableExpression,包含两个联接表和一个联接条件)等。
可以通过如下方法获取多个预设查询对象包括:获取预设数据库查询语句;将预设数据库查询语句按照预设规则进行拆分,获取多个拆分结果;将多个拆分结果分别作为多个预设查询对象。
预设数据库查询语句中几乎涵盖了常用的全部查询对象,因此,只需要将现有的预设数据库查询语句进行拆分,将拆分之后获取到的结果作为预设查询对象。例如,预设数据库查询语句中包含语句SELECT a FROM(SELECT a FROM B INNER JOIN C ON B.ID=C.ID)AS T,因此,可以将该语句进行拆分,包括:SELECT…FROM…;INNER JOIN;B;C。当之后需要获取预设查询对象时,可以参考上述拆分之后的查询对象,如果和待查询的内容相关的话即可以直接调用。
可以通过如下步骤将预设数据库查询语句按照预设规则进行拆分包括:确定预设数据库查询语句的语句结构;按照语句结构,划分出预设数据库查询语句的根节点和叶节点;按照预设数据库查询语句的根节点和叶节点对预设数据库查询语句进行拆分。
可以根据如下方法,按照语句结构,划分出预设数据库查询语句的根节点和叶节点包括:将预设数据库查询语句中包含的物理表、联接表、逻辑表和子查询表作为预设数据库查询语句的叶节点;将预设数据库查询语句中的查询实体作为预设数据库查询语句的根节点。
根据预设数据库查询语句的语句结构,可以将预设数据库查询语句进行合理的拆分,并且对于后续准确完整地调用查询对象十分有利。下面将以图2、图3、图4为例进行具体的说明。
图2是根据本发明的数据库查询语句的生成方法的实施例的第一树形语句结构示意图。预设数据库查询语句为SELECT a FROM tableA。如图2所示,该语句可以描述为:从表(tableA)中取某些列(a)的数据。可以将此语句中的表看作是一个树的节点,整体看作是树的根节点,从而该语句的执行结果就可以描述为根节点。
图3是根据本发明的数据库查询语句的生成方法的实施例的第二树形语句结构示意图。图中的预设数据库查询语句为SELECT a FROM(SELECT a FROM tableA)T。该语句中,有一个嵌套子查询,外层查询从子查询中查询出来结果。如图3所示,该语句可以描述为:从表(tableA)中获取某些列(a)的数据,再将上述结果作为一个表(SELECT a FROM tableA),从该表中获取某些列(a)的数据。可以将此语句中的表看作是一个树的节点,tableA、SELECT a FROM tableA是该树形结构的两个节点,tableA是叶节点、SELECT a FROMtableA为父节点。该语句的最终结果(即整个完整的查询语句)为根节点。
图4是根据本发明的数据库查询语句的生成方法的实施例的第三树形语句结构示意图。图中的预设数据库查询语句为SELECT a FROM(SELECT a FROM B INNER JOIN C ONB.ID=C.ID)T。该语句中,有两个嵌套子查询,第一子查询语句从第二子查询语句中查询出结果,最外层查询从第一子查询语句中查询出结果。该语句可以描述为:首先建立表B和表C的关系表,从表(B INNER JOIN C)中获取某些列(a)的数据,再从SELECT a FROM B INNERJOIN C中获取某些列(a)的数据。可以将此语句中的表看作是一个树的节点,B、C是该树形结构位于最底层的两个叶节点,B INNER JOIN C为位于B、C之上的父节点,SELECT a FROMB INNER JOIN C为位于B INNER JOIN C之上的父节点。该语句的最终结果(即整个完整的查询语句)为根节点。
通过上述几个示例可以说明,预设数据库查询语句可以按照上述树的形式进行拆分,每一个节点,代表着一个表,该表可能是物理表,也可能是临时表、子查询等等,而最终的结果为该树形结构的根节点。
步骤S104,从多个叶查询对象中获取目标叶查询对象。
数据库中已经事先存储了多个叶查询对象,根据查询的需求,可以在多个叶查询对象中进行查找,获取目标叶查询对象,从而可以直接将获取的目标叶查询对象拼装在根查询对象中,这种实现方法简便易行,并且保证了拼接的准确性。例如,如果查询需要获取表B和表C的联接表,则可以直接在多个叶查询对象中查找,从而可以获取Table B INNERJoin Table C。
步骤S106,确定查询列,其中,查询列用于表示待查询内容对应的列。
查询列表示待查询内容对应的列,是用于指定查询的具体内容。例如,查询物理表A的第a列,则可以设定查询列为a。
步骤S108,将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象。
在一个查询过程中,需要确定实现查询需要利用的查询对象,包括物理表、逻辑表、子查询表、联接表等,同时,也需要指定查询上述表中的具体的内容。因此,可以将查询列和目标叶查询对象添加到根查询对象中,则根查询对象便具备了可以查询出预期结果的条件。
可选地,将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象还可以包括:获取预设查询代码,其中,预设查询代码为表示查询条件的代码;将查询列、预设查询代码和目标叶查询对象添加到根查询对象中,得到目标查询对象。
由于在对数据库进行查询的过程中,往往需要查询特定条件下的数据,例如,获取某一个年级排名在前10名的同学的家庭住址。因此,需要在根查询对象中添加入查询条件代码。例如,可以加入过滤条件、分组列、排序规则等查询条件。
步骤S110,根据目标查询对象生成目标数据库查询语句。
可选地,多个叶查询对象用于嵌套在根查询对象中,根据目标查询对象生成目标数据库查询语句包括:获取根查询对象和目标叶查询对象的预设嵌套关系,其中,嵌套在内部的查询对象先于嵌套在外部的查询对象生成目标数据库查询语句;根据预设嵌套关系和目标查询对象生成数据库查询语句。
经过上面的一系列转化,最终的结果只会有一个查询块。该查询块在最终生成SQL语句时,只需从上到下把每一部分都生成为对应的数据库查询语句即可(递归生成),其生成的过程在查询块中自动完成,不需要开发者手动进行,开发者只要指定查询的列、排序列等信息即可,操作十分简易。
例如,获取的根查询对象为SELECT a FROM logicTb;获取的叶查询对象为SELECTa FROM joinTb,命名为logicTb,B INNER JOIN C ON B.ID=C.ID,命名为joinTb,物理表B和C。在生成目标数据库查询语句时,从上到下把每一部分都生成为对应的数据库查询语句即可。最终自动生成的目标数据库查询语句为SELECT a FROM(SELECT a FROM B INNERJOIN C ON B.ID=C.ID)AS T。
从上面的分析可以看出来,本方法首先将预设数据库查询语句进行了拆解,分解出数据库查询语句的构成后,再将每一部分的构成表示为一个对象的结构。开发人员在进行查询语句开发时,只需要维护上述查询对象,即可高效地实现对一个数据库查询语句的拼接。这种方法能够以对象的方式对数据库查询语句进行管理,使得数据库查询语句在程序中实现了本土化,程序可以使用对象的方式控制数据库查询语句,这种方法可以在很大程度上减少拼接出错的几率,对于数据库查询语句的后期维护十分有利。
该实施例由于采用了如下步骤:获取多个预设查询对象,其中,多个预设查询对象包括根查询对象和多个叶查询对象;从多个叶查询对象中获取目标叶查询对象;确定查询列,其中,查询列用于表示待查询内容对应的列;将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象;根据目标查询对象生成目标数据库查询语句,解决了生成数据库查询语句时准确性差的问题,进而通过将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象,再根据目标查询对象生成目标数据库查询语句,达到了提高生成数据库查询语句的准确性的效果。
根据本发明的实施例,提供了一种数据库查询语句的生成装置。需要说明的是,本发明实施例的数据库查询语句的生成装置可以用于执行本发明实施例所提供的数据库查询语句的生成方法,本发明实施例的数据库查询语句的生成方法也可以通过本发明实施例所提供的数据库查询语句的生成装置来执行。
图5是根据本发明的数据库查询语句的生成装置的实施例的示意图。如图5所示,该装置包括:第一获取单元10、第二获取单元20、确定单元30、添加单元40和生成单元50。
第一获取单元10,用于获取多个预设查询对象,其中,多个预设查询对象包括根查询对象和多个叶查询对象。
可选地,第一获取单元10还可以包括:第二获取模块,用于获取预设数据库查询语句;拆分模块,用于将预设数据库查询语句按照预设规则进行拆分,获取多个拆分结果;确定模块,用于将多个拆分结果分别作为多个预设查询对象。
拆分模块包括:确定子模块,用于确定预设数据库查询语句的语句结构;划分子模块,用于按照语句结构,划分出预设数据库查询语句的根节点和叶节点;拆分子模块,用于按照预设数据库查询语句的根节点和叶节点对预设数据库查询语句进行拆分。
第二获取单元20,用于从多个叶查询对象中获取目标叶查询对。
确定单元30,用于确定查询列,其中,查询列用于表示待查询内容对应的列。
添加单元40,用于将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象。
可选地,添加单元40还可以包括:第一获取模块,用于获取预设查询代码,其中,预设查询代码为表示查询条件的代码;添加模块,用于将查询列、预设查询代码和目标叶查询对象添加到根查询对象中,得到目标查询对象。
生成单元50,用于根据目标查询对象生成目标数据库查询语句。
本实施例提供的数据库查询语句的生成装置包括:第一获取单元10、第二获取单元20、确定单元30、添加单元40和生成单元50。通过该装置,解决了生成数据库查询语句时准确性差的问题,进而利用添加单元40将查询列和目标叶查询对象添加到根查询对象中,得到目标查询对象,再利用生成单元50根据目标查询对象生成目标数据库查询语句,达到了提高生成数据库查询语句的准确性的效果。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。