一種查詢數(shù)據(jù)集的方法及裝置制造方法
【專利摘要】本發(fā)明實(shí)施例公開了一種查詢數(shù)據(jù)集的方法及裝置。其中,該方法包括:獲取用于查詢數(shù)據(jù)集的SQL語句;對(duì)所述SQL語句進(jìn)行預(yù)處理,生成預(yù)處理后SQL語句;對(duì)所述預(yù)處理后SQL語句進(jìn)行合法性分析,當(dāng)所述預(yù)處理后SQL語句為不合法語句時(shí),拋出不合法信息;當(dāng)所述預(yù)處理后SQL語句為合法語句時(shí),將所述預(yù)處理后SQL語句拆分成至少一個(gè)SQL關(guān)鍵字段;在所述數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果;返回所述查詢結(jié)果。本發(fā)明實(shí)施例提供的技術(shù)方案,用SQL語句實(shí)現(xiàn)對(duì)數(shù)據(jù)集的查詢,提高了對(duì)多個(gè)數(shù)據(jù)集查詢的通用性,以及簡(jiǎn)化了查詢數(shù)據(jù)集的操作,可以方便的實(shí)現(xiàn)對(duì)緩存在本地的數(shù)據(jù)集進(jìn)行查詢過濾統(tǒng)計(jì)操作。
【專利說明】一種查詢數(shù)據(jù)集的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實(shí)施例涉及數(shù)據(jù)查詢【技術(shù)領(lǐng)域】,尤其涉及一種查詢數(shù)據(jù)集的方法及裝置。
【背景技術(shù)】
[0002]隨著信息化技術(shù)的發(fā)展及數(shù)據(jù)管理技術(shù)的發(fā)展,數(shù)據(jù)庫系統(tǒng)越來越成為計(jì)算機(jī)應(yīng)用中一個(gè)不可缺少的組成模塊。數(shù)據(jù)庫系統(tǒng)使得計(jì)算機(jī)應(yīng)用從科學(xué)計(jì)算為主轉(zhuǎn)化為以數(shù)據(jù)處理為主,并使得計(jì)算機(jī)得以在各行各業(yè)中普遍應(yīng)用起來。
[0003]在使用數(shù)據(jù)庫的提供數(shù)據(jù)查詢服務(wù)過程中,為了提高數(shù)據(jù)庫查詢?cè)L問性能,降低數(shù)據(jù)庫磁盤讀寫訪問量,常用的一個(gè)辦法就是首次查詢時(shí)把查詢結(jié)果從數(shù)據(jù)庫緩存到本地的數(shù)據(jù)集中,其后對(duì)首次查詢結(jié)果后續(xù)的查詢過濾統(tǒng)計(jì)操作都針對(duì)緩存在本地的數(shù)據(jù)集進(jìn)行,不再連接數(shù)據(jù)庫進(jìn)行操作。但對(duì)數(shù)據(jù)集的查詢操作是通過針對(duì)數(shù)據(jù)集編寫的特定代碼來實(shí)現(xiàn)的。
[0004]上述現(xiàn)有技術(shù)存在的技術(shù)缺陷在于:對(duì)緩存在本地的數(shù)據(jù)集的查詢采用特定的代碼來實(shí)現(xiàn),導(dǎo)致對(duì)本地緩存的數(shù)據(jù)集的查詢過濾統(tǒng)計(jì)操作很不方便,并且,在需要對(duì)多個(gè)數(shù)據(jù)集進(jìn)行查詢時(shí),編寫查詢數(shù)據(jù)集的特定代碼工作量大,查詢操作也比較復(fù)雜,不方便實(shí)現(xiàn)對(duì)緩存在本地的數(shù)據(jù)集進(jìn)行查詢過濾統(tǒng)計(jì)操作。
【發(fā)明內(nèi)容】
[0005]本發(fā)明實(shí)施例提供一種查詢數(shù)據(jù)集的方法及裝置,以提高對(duì)緩存在本地的數(shù)據(jù)集查詢的通用性和簡(jiǎn)捷性。
[0006]第一方面,本發(fā)明實(shí)施例提供了一種查詢數(shù)據(jù)集的方法,該方法包括:
[0007]獲取用于查詢數(shù)據(jù)集的SQL語句;
[0008]對(duì)所述SQL語句進(jìn)行預(yù)處理,生成預(yù)處理后SQL語句;
[0009]對(duì)所述預(yù)處理后SQL語句進(jìn)行合法性分析,當(dāng)所述預(yù)處理后SQL語句為不合法語句時(shí),拋出不合法信息;
[0010]當(dāng)所述預(yù)處理后SQL語句為合法語句時(shí),將所述預(yù)處理后SQL語句拆分成至少一個(gè)SQL關(guān)鍵字段;
[0011]在所述數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果;
[0012]返回所述查詢結(jié)果。
[0013]第二方面,本發(fā)明實(shí)施例還提供了一種查詢數(shù)據(jù)集的裝置,該裝置包括:
[0014]獲取單元,用于獲取用于查詢數(shù)據(jù)集的SQL語句;
[0015]預(yù)處理單元,用于對(duì)所述SQL語句進(jìn)行預(yù)處理,生成預(yù)處理后SQL語句;
[0016]分析單元,用于對(duì)所述預(yù)處理后SQL語句進(jìn)行合法性分析,并當(dāng)所述預(yù)處理后SQL語句為不合法語句時(shí),拋出不合法信息;
[0017]拆分單元,用于當(dāng)所述預(yù)處理后SQL語句為合法語句時(shí),將所述預(yù)處理后SQL語句拆分成至少一個(gè)SQL關(guān)鍵字段;
[0018]查詢單元,用于在所述數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果;
[0019]返回單元,用于返回所述查詢結(jié)果。
[0020]本發(fā)明實(shí)施例提供的技術(shù)方案,首先獲取用于查詢數(shù)據(jù)集的SQL語句,然后對(duì)所述SQL語句進(jìn)行預(yù)處理和合法性分析,當(dāng)SQL語句為合法語句時(shí),將SQL語句按照關(guān)鍵字拆分成關(guān)鍵字段,在數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果,最后將查詢結(jié)果存儲(chǔ)到查詢結(jié)果集中,用SQL語句實(shí)現(xiàn)對(duì)數(shù)據(jù)集的查詢不需要編寫針對(duì)數(shù)據(jù)集查詢的特定代碼,提高了對(duì)多個(gè)數(shù)據(jù)集查詢的通用性,以及簡(jiǎn)化了查詢數(shù)據(jù)集的操作,可以更方便的實(shí)現(xiàn)對(duì)緩存在本地的數(shù)據(jù)集進(jìn)行查詢過濾統(tǒng)計(jì)操作。
【專利附圖】
【附圖說明】
[0021]圖1是本發(fā)明實(shí)施例一提供的一種查詢數(shù)據(jù)集的方法的流程示意圖;
[0022]圖2是本發(fā)明實(shí)施例二提供的一種查詢數(shù)據(jù)集的方法的流程示意圖;
[0023]圖3是本發(fā)明實(shí)施例二提供的一種查詢數(shù)據(jù)集的方法所涉及的查詢條件語法樹的結(jié)構(gòu)不意圖;
[0024]圖4是本發(fā)明實(shí)施例三提供的一種查詢數(shù)據(jù)集的裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0025]下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說明。可以理解的是,此處所描述的具體實(shí)施例僅僅用于解釋本發(fā)明,而非對(duì)本發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部結(jié)構(gòu)。
[0026]實(shí)施例一
[0027]圖1是本發(fā)明實(shí)施例一提供的一種查詢數(shù)據(jù)集的方法的流程示意圖。該方法可以由查詢數(shù)據(jù)集的裝置來執(zhí)行,所述裝置由軟件來實(shí)現(xiàn)。參見圖1,本實(shí)施例提供的查詢數(shù)據(jù)集的方法具體包括如下操作:
[0028]操作S110、獲取用于查詢數(shù)據(jù)集的SQL語句。
[0029]傳統(tǒng)的對(duì)緩存在本地的數(shù)據(jù)集的查詢操作通常是采用特定代碼實(shí)現(xiàn),不具有通用性,且對(duì)緩存在本地的數(shù)據(jù)集進(jìn)行查詢過濾統(tǒng)計(jì)操作復(fù)雜。為此,本實(shí)施例可使用SQL語句來查詢緩存在本地的數(shù)據(jù)集,提高對(duì)本地緩存數(shù)據(jù)集查詢過濾統(tǒng)計(jì)操作的通用性和簡(jiǎn)捷性。
[0030]在本實(shí)施例中,獲取用于查詢數(shù)據(jù)集的SQL語句,可具體為:
[0031]向用于管理數(shù)據(jù)庫的功能模塊或電子設(shè)備,發(fā)起首次查詢請(qǐng)求;
[0032]獲取用于管理數(shù)據(jù)庫的功能模塊或電子設(shè)備根據(jù)首次查詢請(qǐng)求得到的SQL語句,以及相應(yīng)的數(shù)據(jù)集,并將該數(shù)據(jù)集緩存在本地。
[0033]操作S120、對(duì)所述SQL語句進(jìn)行預(yù)處理,生成預(yù)處理后SQL語句。
[0034]該操作中,對(duì)SQL語句進(jìn)行預(yù)處理可以為以下操作:將SQL語句中的多行語句替換成單行,這主要是通過將回車符(\a)和換行符(\n)替換為空格實(shí)現(xiàn)的^fSQL語句中的跳格鍵(\t)替換成空格;將SQL語句中包含的連續(xù)空格替換成單個(gè)空格;將SQL語句中SQL保留字符串全部變成小寫形式,SQL保留字符串有where、select、from、group by、orderby、asc、desc、like、min、max、avg、sum、count等。在對(duì)SQL語句進(jìn)行預(yù)處理后,得到預(yù)處理后SQL語句。
[0035]操作S130、對(duì)所述預(yù)處理后SQL語句進(jìn)行合法性分析,當(dāng)所述預(yù)處理后SQL語句為不合法語句時(shí),拋出不合法信息。
[0036]該操作中,對(duì)預(yù)處理后得到的預(yù)處理后SQL語句進(jìn)行合法性分析可以為以下操作:
[0037]對(duì)SQL語句中SQL保留字符串的拼寫正確性進(jìn)行判斷;
[0038]對(duì)SQL保留字符串的組合正確性進(jìn)行判斷;
[0039]對(duì)SQL語句中單引號(hào)成對(duì)與否進(jìn)行判斷;
[0040]對(duì)SQL語句中雙引號(hào)成對(duì)與否進(jìn)行判斷;
[0041]對(duì)SQL語句中括號(hào)成對(duì)與否進(jìn)行判斷;
[0042]對(duì)SQL語句中字段命名正確性進(jìn)行判斷;優(yōu)選的,字段名用f加一個(gè)數(shù)字組成,數(shù)字為該字段在數(shù)據(jù)集記錄中的位置,第一個(gè)為1,其后為2、3、4,依次類推,若字段名符合此命名規(guī)則,則命名正確,否則命名錯(cuò)誤;
[0043]對(duì)SQL語句中條件字段的value字符串長(zhǎng)度的合法性進(jìn)行判斷;優(yōu)選的,每個(gè)value字符串的最大長(zhǎng)度為1024個(gè)字符,最小長(zhǎng)度為I個(gè)字符,所以SQL語句中條件字段的value字符串長(zhǎng)度在I?1024字符之間為合法關(guān)鍵字段,否則不合法。
[0044]在對(duì)SQL語句進(jìn)行合法性分析的過程中,一旦發(fā)現(xiàn)SQL語句存在不合法問題,后續(xù)操作將不再進(jìn)行,通過拋出合法性異常信息給出異常提示。
[0045]操作S140、當(dāng)所述預(yù)處理后SQL語句為合法語句時(shí),將所述預(yù)處理后SQL語句拆分成至少一個(gè)SQL關(guān)鍵字段。
[0046]本實(shí)施例將SQL語句進(jìn)行拆分,將SQL語句拆分成至少一個(gè)關(guān)鍵字段。關(guān)鍵字段可以為select段、from段、where段、groupby段、having段、orderby段,拆分后能夠方便地提取對(duì)本地上的哪個(gè)數(shù)據(jù)集進(jìn)行處理、查詢滿足哪些條件、分組條件、篩選條件、排序條件以及返回包含哪些字段的結(jié)果集等。
[0047]操作S150、在所述數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果。
[0048]操作S160、返回所述查詢結(jié)果。
[0049]需要說明的是,本實(shí)施例僅以對(duì)數(shù)據(jù)集的查詢操作為例進(jìn)行了說明,另外,對(duì)數(shù)據(jù)集的過濾統(tǒng)計(jì)等操作原理相同。
[0050]本實(shí)施例首先獲取用于查詢數(shù)據(jù)集的SQL語句,然后對(duì)所述SQL語句進(jìn)行預(yù)處理得到預(yù)處理后SQL語句,對(duì)預(yù)處理后SQL語句進(jìn)行合法性分析,當(dāng)預(yù)處理后SQL語句為合法語句時(shí),將預(yù)處理后SQL語句按照關(guān)鍵字拆分成關(guān)鍵字段,在數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果,最后將查詢結(jié)果存儲(chǔ)到查詢結(jié)果集中,用SQL語句實(shí)現(xiàn)對(duì)數(shù)據(jù)集的查詢不需要編寫針對(duì)數(shù)據(jù)集查詢的特定代碼,提高了對(duì)多個(gè)數(shù)據(jù)集查詢的通用性,簡(jiǎn)化了查詢數(shù)據(jù)集的操作,可以更方便的實(shí)現(xiàn)對(duì)緩存在本地的數(shù)據(jù)集進(jìn)行查詢過濾統(tǒng)計(jì)操作。
[0051]實(shí)施例二
[0052]圖2是本發(fā)明實(shí)施例二提供的一種查詢數(shù)據(jù)集的方法的流程示意圖。本實(shí)施例在上述實(shí)施例一的基礎(chǔ)上,對(duì)其操作S140和操作S150進(jìn)行優(yōu)化。參見圖2,本實(shí)施例提供的查詢數(shù)據(jù)集的方法具體包括如下操作:
[0053]操作S210、獲取用于查詢數(shù)據(jù)集的SQL語句。
[0054]操作S220、對(duì)所述SQL語句進(jìn)行預(yù)處理,生成預(yù)處理后SQL語句。
[0055]操作S230、對(duì)所述預(yù)處理后SQL語句進(jìn)行合法性分析,當(dāng)所述預(yù)處理后SQL語句為不合法語句時(shí),拋出不合法信息。
[0056]操作S241、判斷所述預(yù)處理后SQL語句是否是嵌套SQL語句。
[0057]在確定預(yù)處理后SQL語句為合法語句后對(duì)預(yù)處理后SQL語句進(jìn)行拆分和查詢操作,在拆分和查詢操作之前,先判斷預(yù)處理后SQL語句是否是嵌套SQL語句,如果預(yù)處理后SQL語句是嵌套SQL語句則依次執(zhí)行操作S242、操作S251和操作S260 ;如果預(yù)處理后SQL語句不是嵌套SQL語句則依次執(zhí)行操作S243、操作S252和操作S260。
[0058]操作S242、將所述預(yù)處理后SQL語句按照嵌套層次由里到外依次拆分成相應(yīng)的SQL子語句,以及將所述SQL子語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段。
[0059]當(dāng)所述預(yù)處理后SQL語句是嵌套SQL語句時(shí),對(duì)預(yù)處理后SQL語句的拆分操作包括兩個(gè)步驟:第一步實(shí)現(xiàn)嵌套SQL語句嵌套關(guān)系的拆分,具有嵌套關(guān)系的SQL語句在后續(xù)查詢時(shí)會(huì)從嵌套關(guān)系層最里層逐步執(zhí)行到最外層,相應(yīng)的對(duì)嵌套SQL語句按照嵌套層次由里到外依次拆分成相應(yīng)的SQL子語句。第二步實(shí)現(xiàn)SQL子句到SQL段的拆分,即將SQL子語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段,SQL關(guān)鍵字段可以為select段、from段、where段、groupby段、having段、orderby段等。拆分后能夠方便地提取對(duì)本地上的哪個(gè)數(shù)據(jù)集進(jìn)行處理、查詢滿足哪些條件、分組條件、篩選條件、排序條件以及返回包含哪些字段的結(jié)果集。
[0060]為了更清楚的說明嵌套SQL語句拆分的過程,先進(jìn)行舉例說明。例如,預(yù)處理后 SQL 語句為嵌套語句 A:“select f I, f3 from(select f I, f2, f3 from tl where f2 =beijing or f3 = beijing)where fI = 010 order by f3 desc,,。
[0061]第一步,實(shí)現(xiàn)嵌套SQL語句嵌套關(guān)系的拆分,預(yù)處理后SQL語句A被拆分成SQL子句 Al 和 SQL 子句 A2,其中 Al 為:“select fl, f3 from A2 where fl = OlOorder by f3desc” ;A2 為:“select fI, f2, f3 from tl where f2 = beijing or f3 = Beijing,,。
[0062]第二步,將SQL子句Al和SQL子句A2拆分成SQL關(guān)鍵字段,針對(duì)SQL子句A2將拆分成:關(guān)鍵字段select fl, f2, f3 ;關(guān)鍵字段from 11 ;關(guān)鍵字段where f2 = beijing orf3 = Beijing。針對(duì)SQL子句Al將拆分成:關(guān)鍵字段select fl, f3 ;關(guān)鍵字段from A2 ;關(guān)鍵字段 where fl = 010 ;關(guān)鍵字段 order by f3 desc。
[0063]操作S243、將所述預(yù)處理后SQL語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段。
[0064]當(dāng)所述預(yù)處理后SQL語句不是嵌套SQL語句時(shí),直接將預(yù)處理后SQL語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段。
[0065]操作S251、按照嵌套層次由里到外的順序以及預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果。
[0066]這里,預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序?yàn)椴僮鱏242中SQL子句拆分成SQL關(guān)鍵字段的順序。對(duì)預(yù)處理后SQL語句的查詢操作,會(huì)根據(jù)SQL語句嵌套關(guān)系從最里層到最外層逐步執(zhí)行SQL子句查詢操作,每一個(gè)SQL子句的查詢又包括對(duì)SQL子句中每一個(gè)SQL關(guān)鍵字段的查詢,在執(zhí)行查詢時(shí)會(huì)先進(jìn)行SQL子句A2的查詢,執(zhí)行完畢后再執(zhí)行SQL子句Al的查詢。
[0067]作為一種【具體實(shí)施方式】,預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序依次為:fr0m段,where段,group by段、having段、order by段和select段。則對(duì)SQL子句中SQL關(guān)鍵字段的查詢可以分為以下幾個(gè)步驟執(zhí)行:第一步通過分析from段獲得查詢的數(shù)據(jù)集;第二步通過分析where段獲得查詢條件,對(duì)數(shù)據(jù)集進(jìn)行篩選;第三步通過分析group by段獲得數(shù)據(jù)分組情況,對(duì)第二步的結(jié)果數(shù)據(jù)進(jìn)行分組操作;第四步通過分析聚集函數(shù),對(duì)第三步的結(jié)果進(jìn)行計(jì)算處理;第五步通過分析having段獲得篩選分組情況,對(duì)第四步的結(jié)果進(jìn)行篩選分組處理;第六步通過分析order by段對(duì)結(jié)果集進(jìn)行排序,對(duì)結(jié)果集排序包括ASC (升序)和DESC (降序)兩種;第七步通過分析select段對(duì)第六步的結(jié)果進(jìn)行按規(guī)定字段輸出。
[0068]操作S252、按照預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果。
[0069]當(dāng)所述預(yù)處理后SQL語句不是嵌套SQL語句時(shí),直接按照預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,并獲取查詢結(jié)果。
[0070]操作S260、返回所述查詢結(jié)果。
[0071]在本實(shí)施例的一種優(yōu)選的實(shí)施方式中,在所述數(shù)據(jù)集中執(zhí)行與SQL關(guān)鍵字段中條件字段對(duì)應(yīng)的查詢可以采用以下操作:
[0072]獲取SQL關(guān)鍵字段中條件字段的查詢條件,并根據(jù)所述查詢條件生成查詢條件語法樹;
[0073]根據(jù)所述查詢條件語法樹,在所述數(shù)據(jù)集中執(zhí)行與所述條件字段對(duì)應(yīng)的查詢操作。
[0074]在上述優(yōu)選實(shí)施方式中,根據(jù)查詢條件生成查詢條件語法樹具體為:將查詢條件對(duì)應(yīng)的查詢表達(dá)式轉(zhuǎn)換成查詢條件語法樹。例如,某條件字段的查詢條件B為(f2 =beijing or f3< = 4) and (f 2 = shanghai or f3<6 or f4>2),則查詢條件 B 被轉(zhuǎn)換成如圖3所示的條件語法樹。在對(duì)執(zhí)行與條件字段對(duì)應(yīng)的查詢操作時(shí),從查詢條件語法樹的葉子開始逐步查找查詢項(xiàng),并調(diào)用對(duì)應(yīng)的查詢函數(shù)執(zhí)行查詢操作。本實(shí)施例的查詢項(xiàng)是指一顆查詢條件語法樹中僅包含葉子的子樹。一個(gè)查詢項(xiàng)在執(zhí)行完查詢操作后,會(huì)把該查詢項(xiàng)用其返回值替換為一個(gè)葉子。
[0075]如圖3所示的查詢條件語法樹,首先執(zhí)行f2 = Bei jing、f3〈 = 4、f2 = shangha1、f3〈6、f4>2的查詢操作,然后用所得的查詢結(jié)果替換查詢條件語法樹中的這5個(gè)查詢項(xiàng),其次會(huì)執(zhí)行第二層的兩個(gè)or查詢項(xiàng),然后用查詢結(jié)果替換查詢條件語法樹中的這兩個(gè)查詢項(xiàng),最后執(zhí)行第一層的and查詢項(xiàng)。其中函數(shù)可以為大于查詢函數(shù)、小于查詢函數(shù)、等于查詢函數(shù)、小于等于查詢函數(shù)、大于等于查詢函數(shù)、like查詢函數(shù)、between查詢函數(shù)、and查詢函數(shù)、or查詢函數(shù)、not查詢函數(shù)。
[0076]本實(shí)施例首先獲取用于查詢數(shù)據(jù)集的SQL語句;然后對(duì)所述SQL語句進(jìn)行預(yù)處理得到預(yù)處理后SQL語句,對(duì)預(yù)處理后SQL語句進(jìn)行合法性分析,當(dāng)預(yù)處理后SQL語句為合法語句時(shí),判斷預(yù)處理后SQL語句是否為嵌套SQL語句,若預(yù)處理后SQL語句是嵌套SQL語句,先根據(jù)嵌套關(guān)系將預(yù)處理后SQL語句拆分成SQL子句,再將SQL子句拆分成SQL關(guān)鍵字段,否則直接將預(yù)處理后SQL語句拆分成SQL關(guān)鍵字段,使得拆分后的SQL語句能夠方便的提取對(duì)哪個(gè)數(shù)據(jù)集進(jìn)行操作,以及查詢滿足的條件和返回包含哪些字段的結(jié)果集,其次,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果;最后,將查詢結(jié)果存儲(chǔ)到結(jié)果集中。用SQL語句實(shí)現(xiàn)對(duì)數(shù)據(jù)集的查詢不需要編寫針對(duì)數(shù)據(jù)集查詢的特定代碼,提高了對(duì)多個(gè)數(shù)據(jù)集查詢的通用性,以及簡(jiǎn)化了查詢數(shù)據(jù)集的操作,可以更方便的實(shí)現(xiàn)對(duì)緩存在本地的數(shù)據(jù)集進(jìn)行查詢過濾統(tǒng)計(jì)操作。
[0077]實(shí)施例三
[0078]圖4是本發(fā)明實(shí)施例三提供的一種查詢數(shù)據(jù)集的裝置的結(jié)構(gòu)示意圖。參見圖4,該裝置的具體結(jié)構(gòu)如下:
[0079]獲取單元401,用于獲取用于查詢數(shù)據(jù)集的SQL語句;
[0080]預(yù)處理單元402,用于對(duì)所述SQL語句進(jìn)行預(yù)處理,生成預(yù)處理后SQL語句;
[0081]分析單元403,用于對(duì)所述預(yù)處理后SQL語句進(jìn)行合法性分析,并當(dāng)所述預(yù)處理后SQL語句為不合法語句時(shí),拋出不合法信息;
[0082]拆分單元404,用于當(dāng)所述預(yù)處理后SQL語句為合法語句時(shí),將所述預(yù)處理后SQL語句拆分成至少一個(gè)SQL關(guān)鍵字段;
[0083]查詢單元405,用于在所述數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果;
[0084]返回單元406,用于返回所述查詢結(jié)果。
[0085]進(jìn)一步的,所述拆分單元404還包括:判斷子單元4041,用于判斷所述預(yù)處理后SQL語句是否是嵌套SQL語句;
[0086]第一拆分子單元4042,用于當(dāng)所述預(yù)處理后SQL語句是嵌套SQL語句時(shí),將所述預(yù)處理后SQL語句根據(jù)嵌套層次由里到外依次拆分成相應(yīng)的SQL子語句,以及將所述SQL子語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段;
[0087]第二拆分子單元4043,用于當(dāng)所述預(yù)處理后SQL語句不是嵌套SQL語句時(shí),將所述預(yù)處理后SQL語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段。
[0088]進(jìn)一步的,所述查詢單元具體用于:
[0089]當(dāng)所述預(yù)處理后SQL語句是嵌套SQL語句時(shí),按照嵌套層次由里到外的順序以及預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果;
[0090]當(dāng)所述預(yù)處理后SQL語句不是嵌套SQL語句時(shí),按照預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果。
[0091]進(jìn)一步的,SQL關(guān)鍵字段包括條件字段;所述查詢單元包括條件查詢子單元,用于:獲取SQL關(guān)鍵字段中條件字段的查詢條件,并根據(jù)查詢條件生成查詢條件語法樹;
[0092]根據(jù)所述查詢條件語法樹,在所述數(shù)據(jù)集中執(zhí)行與所述條件字段對(duì)應(yīng)的查詢操作。
[0093]上述產(chǎn)品可執(zhí)行本發(fā)明任意實(shí)施例所提供的方法,具備執(zhí)行方法相應(yīng)的功能模塊和有益效果。
[0094]注意,上述僅為本發(fā)明的較佳實(shí)施例及所運(yùn)用技術(shù)原理。本領(lǐng)域技術(shù)人員會(huì)理解,本發(fā)明不限于這里所述的特定實(shí)施例,對(duì)本領(lǐng)域技術(shù)人員來說能夠進(jìn)行各種明顯的變化、重新調(diào)整和替代而不會(huì)脫離本發(fā)明的保護(hù)范圍。因此,雖然通過以上實(shí)施例對(duì)本發(fā)明進(jìn)行了較為詳細(xì)的說明,但是本發(fā)明不僅僅限于以上實(shí)施例,在不脫離本發(fā)明構(gòu)思的情況下,還可以包括更多其他等效實(shí)施例,而本發(fā)明的范圍由所附的權(quán)利要求范圍決定。
【權(quán)利要求】
1.一種查詢數(shù)據(jù)集的方法,其特征在于,包括: 獲取用于查詢數(shù)據(jù)集的SQL語句; 對(duì)所述SQL語句進(jìn)行預(yù)處理,生成預(yù)處理后SQL語句; 對(duì)所述預(yù)處理后SQL語句進(jìn)行合法性分析,當(dāng)所述預(yù)處理后SQL語句為不合法語句時(shí),拋出不合法信息; 當(dāng)所述預(yù)處理后SQL語句為合法語句時(shí),將所述預(yù)處理后SQL語句拆分成至少一個(gè)SQL關(guān)鍵字段; 在所述數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果; 返回所述查詢結(jié)果。
2.根據(jù)權(quán)利要求1所述的查詢數(shù)據(jù)集的方法,其特征在于,當(dāng)所述預(yù)處理后SQL語句為合法語句時(shí),將所述預(yù)處理后SQL語句拆分成至少一個(gè)SQL關(guān)鍵字段,包括: 判斷所述預(yù)處理后SQL語句是否是嵌套SQL語句; 當(dāng)所述預(yù)處理后SQL語句是嵌套SQL語句時(shí),將所述預(yù)處理后SQL語句按照嵌套層次由里到外依次拆分成相應(yīng)的SQL子語句,以及將所述SQL子語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段; 當(dāng)所述預(yù)處理后SQL語句不是嵌套SQL語句時(shí),將所述預(yù)處理后SQL語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段。
3.根據(jù)權(quán)利要求2所述的查詢數(shù)據(jù)集的方法,其特征在于,在所述數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果,包括: 當(dāng)所述預(yù)處理后SQL語句是嵌套SQL語句時(shí),按照嵌套層次由里到外的順序以及預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果; 當(dāng)所述預(yù)處理后SQL語句不是嵌套SQL語句時(shí),按照預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果。
4.根據(jù)權(quán)利要求3所述的查詢數(shù)據(jù)集的方法,其特征在于,SQL關(guān)鍵字段包括條件字段; 在所述數(shù)據(jù)集中執(zhí)行與所述條件字段對(duì)應(yīng)的查詢操作,包括: 獲取SQL關(guān)鍵字段中條件字段的查詢條件,并根據(jù)所述查詢條件生成查詢條件語法樹; 根據(jù)所述查詢條件語法樹,在所述數(shù)據(jù)集中執(zhí)行與所述條件字段對(duì)應(yīng)的查詢操作。
5.一種查詢數(shù)據(jù)集的裝置,其特征在于,包括: 獲取單元,用于獲取用于查詢數(shù)據(jù)集的SQL語句; 預(yù)處理單元,用于對(duì)所述SQL語句進(jìn)行預(yù)處理,生成預(yù)處理后SQL語句; 分析單元,用于對(duì)所述預(yù)處理后SQL語句進(jìn)行合法性分析,并當(dāng)所述預(yù)處理后SQL語句為不合法語句時(shí),拋出不合法信息; 拆分單元,用于當(dāng)所述預(yù)處理后SQL語句為合法語句時(shí),將所述預(yù)處理后SQL語句拆分成至少一個(gè)SQL關(guān)鍵字段; 查詢單元,用于在所述數(shù)據(jù)集中執(zhí)行與所述SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果; 返回單元,用于返回所述查詢結(jié)果。
6.根據(jù)權(quán)利要求5所述的查詢數(shù)據(jù)集的裝置,其特征在于,所述拆分單元包括: 判斷子單元,用于判斷所述預(yù)處理后SQL語句是否是嵌套SQL語句; 第一拆分子單元,用于當(dāng)所述預(yù)處理后SQL語句是嵌套SQL語句時(shí),將所述預(yù)處理后SQL語句根據(jù)嵌套層次由里到外依次拆分成相應(yīng)的SQL子語句,以及將所述SQL子語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段; 第二拆分子單元,用于當(dāng)所述預(yù)處理后SQL語句不是嵌套SQL語句時(shí),將所述預(yù)處理后SQL語句按照關(guān)鍵字先后依次拆分成SQL關(guān)鍵字段。
7.根據(jù)權(quán)利要求6所述的查詢數(shù)據(jù)集的裝置,其特征在于,所述查詢單元具體用于: 當(dāng)所述預(yù)處理后SQL語句是嵌套SQL語句時(shí),按照嵌套層次由里到外的順序以及預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果; 當(dāng)所述預(yù)處理后SQL語句不是嵌套SQL語句時(shí),按照預(yù)先設(shè)定的各SQL關(guān)鍵字段的先后順序,在所述數(shù)據(jù)集中依次執(zhí)行與所述預(yù)處理后SQL語句中的各SQL關(guān)鍵字段對(duì)應(yīng)的查詢操作,以獲取查詢結(jié)果。
8.根據(jù)權(quán)利要求7所述的查詢數(shù)據(jù)集的裝置,其特征在于,SQL關(guān)鍵字段包括條件字段; 所述查詢單元包括條件查詢子單元,用于:獲取SQL關(guān)鍵字段中條件字段的查詢條件,并根據(jù)查詢條件生成查詢條件語法樹; 根據(jù)所述查詢條件語法樹,在所述數(shù)據(jù)集中執(zhí)行與所述條件字段對(duì)應(yīng)的查詢操作。
【文檔編號(hào)】G06F17/30GK104391923SQ201410667802
【公開日】2015年3月4日 申請(qǐng)日期:2014年11月20日 優(yōu)先權(quán)日:2014年11月20日
【發(fā)明者】賈高峰, 田晉坤, 曹良景 申請(qǐng)人:北京銳安科技有限公司