在數(shù)據(jù)庫編程中,管理人員需要經(jīng)常從數(shù)據(jù)庫中查詢數(shù)據(jù)。當(dāng)查詢條件為確定時(shí),我們可以明確用的SQL語句來實(shí)現(xiàn),但是當(dāng)查詢條件為多個(gè)條件的動態(tài)組合時(shí),查詢語句會由于分支太多及IF語句的多重嵌套而變得相當(dāng)復(fù)雜。在此,筆者提供了一種優(yōu)化方法,運(yùn)用本方法可以有效地減少查詢語句的分支和數(shù)量以及IF條件語句的嵌套層數(shù),從而提高程序的運(yùn)行效率。
下面我們以一個(gè)簡單的例子來說明,假設(shè)有一個(gè)名為employee的表,現(xiàn)在我們要從其中查詢數(shù)據(jù),條件有三個(gè),由用戶動態(tài)選擇,如圖1所示:
其中條件A、B、C之間是與的關(guān)系,A、B、C均為動態(tài)選擇,可以取其中的一個(gè)、兩個(gè)或三個(gè),也可以一個(gè)都不選,當(dāng)三個(gè)條件都不選擇時(shí)則認(rèn)為是無條件查詢,按照通常的做法,判斷方法如圖2所示:
這樣,最終的結(jié)果有8個(gè),即有8條查詢語句,分別是
1.select * from employee;
2.select * from employee where Age =C ;
3.select * from employee where Sex=B;
4.select * from employee where Sex=B and Age=C;
5.select * from employee where Name=A;
6.select * from employee where Name=A and Age=C;
7.select * from employee where Name=A and Sex=B ;
8.select * from employee where Name=A and Sex=B and Age=C;
顯然這是比較煩瑣的,而且用到了多重嵌套IF語句,因而在條件增多時(shí),其復(fù)雜程度將大大增加。我們對它進(jìn)行優(yōu)化,方法如下:
首先定義一個(gè)字符串Str_Result用來存放組合條件的結(jié)果,開始時(shí)為空。
用程序語言描述如下:
if A <> "" then
Str_Result="where Name =A"
end if
if B <> "" then
if Str_Result="" then
Str_Result="where Sex=B"
else
Str_Result=Str_Result+"and Sex = B"
end if
end if
if C <> "" then
if Str_Result="" then
Str_Result="where Age =C"
else
Str_Result=Str_Result+"and Age=C"
end if
end if
最終的結(jié)果查詢語句為:select * from employee + Str_Result。
顯然,這種方法減少了組合的分支和if語句的多重嵌套,從而提高了程序的效率。
本方法的原理在于定義了一個(gè)單獨(dú)的字符串來表示組合的結(jié)果,當(dāng)該字符串經(jīng)過條件A后其值為A的條件,經(jīng)過條件B后其值則為條件A與B 組合的結(jié)果,而當(dāng)經(jīng)過條件C后其值則變成條件A、B、C的組合,從而減少了組合判斷的分支,對于更多條件的組合,其效能將更加明顯。