SQL中多條件查詢括號的用途

weixin_34344677發表於2009-12-15

介面:

 

ExpandedBlockStart.gif程式碼
select id,routeName,routeCharacteristic,routeIntroductions,costDetail,participate,click,routeCategory,dineMenu,weather,isEnable,addPerson,addDate,competitiveProducts,luxury,onVacation,characteristic,hotRecommend,referencesPrice,specialPreference,imgShow,imgName,imgUrl,newProduct,overflow,season,priority from Tab_TouristTrack
where (addDate>=@beginDate or @beginDate=''and (addDate<=@endDate or @endDate='')
and (routeName like @routeName or @routeName='')
and (newProduct=1 or competitiveProducts=1 or luxury=1 or onVacation=1 or characteristic=1
or specialPreference=1 or hotRecommend=1 or overflow=1 or season=1)
and (priority=0 or priority is null)

 

 

以上語句是一個多條件查詢語句,假如沒有用括號分開的話,那麼只有所有條件都為真才會查出資料庫中所滿足條件的行,但是這不是我所想要的,所以才需要用括號如:(addDate>=@beginDate or @beginDate=''),意思是當使用者輸入資料時,則根據addDate>=@beginDate的條件來查詢資料庫中滿足條件的資料,如果使用者不輸入任何資料,那麼這個時候文字框所得到的值則為:""-->空的字串,使用@beginDate='' (變成sql語句:' '=' ' )也能使這個where子句滿足條件,否則的話很難實現像這樣的多條件語句查詢.

 

在來看下這條子句:

(newProduct=1 or competitiveProducts=1 or luxury=1 or onVacation=1 or characteristic=1
or specialPreference=1 or hotRecommend=1 or overflow=1 or season=1)

這裡加括號的意思是當滿足前面子句所有條件的情況下並且還要滿足括號內這些欄位至少有一個為1的資料.

 

(priority=0 or priority is null)

這裡加括號的意思是當滿足前面子句所有條件的情況下並且還要滿足括號priority=0或者priority為空的資料

 

如果在子句:

(priority=0 or priority is null)

中不加括號的話,那麼priority前滿足所有的條件下,在使用or priority is null這樣就不是我們要的資料了.

這條子句加括號也是和上面子句同一個意思

(newProduct=1 or competitiveProducts=1 or luxury=1 or onVacation=1 or characteristic=1
or specialPreference=1 or hotRecommend=1 or overflow=1 or season=1)

 

使用括號的目的就是將一小段sql子句作為一個整體來使用.

簡單的說就是在滿足前面所有子句的情況下還要滿足(priority=0 or priority is null)返回為ture的資料.

 

 

ExpandedBlockStart.gif得到文字中輸入的值呼叫後臺資料庫程式碼
  private void PriorityBinds()
    {
        gvPriority.DataKeyNames 
= new String[] { "id" };
        gvPriority.DataSource 
= tts.PriorityQuery(ddlType.SelectedValue,txtBeginDate.Text,txtEndDate.Text
            ,txtTouristTrackName.Text,rblPriority.SelectedValue);
        gvPriority.DataBind();
    }

 

 

 

ExpandedBlockStart.gif程式碼
 public DataTable PriorityQuery(String MenuType, String beginDate, String endDate, String routeName, String priority)
        {
            StringBuilder strSql 
= new StringBuilder();

            strSql.Append(
" select id,routeName,routeCharacteristic,routeIntroductions,costDetail,participate,click,routeCategory,dineMenu,weather,isEnable,addPerson,addDate,competitiveProducts,luxury,onVacation,characteristic,hotRecommend,referencesPrice,specialPreference,imgShow,imgName,imgUrl,newProduct,overflow,season,priority ");
            strSql.Append(
" from Tab_TouristTrack ");
            strSql.Append(
" where (addDate>=@beginDate or @beginDate='') and (addDate<=dateadd(dd,1,@endDate) or @endDate='')");
            strSql.Append(
" and (routeName like @routeName or @routeName='')");

            
if (MenuType != "all")
            {
                    strSql.Append(
" and "+MenuType + "=1");
            }
            
else
            {
                strSql.Append(
" and (newProduct=1 or competitiveProducts=1 or luxury=1 or onVacation=1 or characteristic=1");
                strSql.Append(
" or specialPreference=1 or hotRecommend=1 or overflow=1 or season=1)");
            }

            
if (priority!="all")
            {
                
if (priority=="1")
                {
                    strSql.Append(
" and priority=1");
                }
                
else
                {
                    strSql.Append(
" and (priority=0 or priority is null)");
                }
            }

            strSql.Append(
" order by priority desc");

            SqlParameter[] param 
= new SqlParameter[] 
            { 
                
new SqlParameter("@beginDate",beginDate),
                
new SqlParameter("@endDate",endDate),
                
new SqlParameter("@routeName","%"+routeName+"%")
            };

            
return SQLLinkDatabase.Query(strSql.ToString(),param).Tables[0];
        }

 

 

相關文章