mysql 資料庫查詢-動態組裝mysql

來源:互聯網
上載者:User

標籤:

要實現這種動態SQL語句拼裝,我們可以在宿主語言中建立一個字串,然後逐個判斷各個複選框是否選中來向這個字串中添加SQL語句片段。 這裡有一個問題就是當有複選框被選中的時候SQL語句是含有WHERE子句的, 而當所有的複選框都沒有被選中的時候就沒有WHERE子句了,因此在添加每一個過濾條件判斷的時候都要判斷是否已經存在WHERE語句了,如果沒有WHERE語句則添加WHERE語句。 在判斷每一個複選框的時候都要去判斷, 這使得用起來非常麻煩,因此開發人員想到了一個捷徑:為SQL語句指定一個永遠為真的條件陳述式(比如“1=1”),這樣就不用考慮WHERE語句是否存在的問題了。虛擬碼如下:

String sql = " SELECT * FROM T_Employee WHERE 1=1";
if(工號複選框選中)
{
sql.appendLine("AND FNumber BETWEEN ‘ "+工號文字框1內容+" ‘ AND ‘ "+工號
文字框2內容+" ‘ ");
}
if(姓名複選框選中)
{
sql.appendLine("AND FName LIKE ‘%"+姓名文字框內容+"%‘");
}
if(年齡複選框選中)
{
sql.appendLine("AND FAge BETWEEN ‘ "+年齡文字框1內容+" ‘AND‘ "+年齡文字框2
內容+" ‘ ");
}
executeSQL(sql);

但是使用添加了“1=1”的過濾條件以後資料庫系統就無法使用索引等查詢最佳化策略,資料庫系統將會被迫對每行資料進行掃描(也就是全表掃描)以比較此行是否滿足過濾條件,當表中資料量比較大的時候查詢速度會非常慢。

 另外一種方法:

private void doQuery()
{
Bool hasWhere = false;
StringBuilder sql = new StringBuilder(" SELECT * FROM T_Employee");
if(工號複選框選中)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);

sql.appendLine("FNumber BETWEEN ‘"+工號文字框1內容+"‘ AND ‘"+工號
文字框2內容+"‘");
}
if(姓名複選框選中)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);
sql.appendLine("FName LIKE ‘%"+姓名文字框內容+"%‘");
}
if(年齡複選框選中)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);
sql.appendLine("FAge BETWEEN "+年齡文字框1內容+" AND "+年齡文字框2
內容);
}
executeSQL(sql);
}
private Bool appendWhereIfNeed(StringBuilder sql,Bool hasWhere)
{
if(hasWhere==false)
{
sql. appendLine("WHERE");
}
else
{
sql. appendLine("AND");
}
}

 

 

 

 

 

 

 

 

 

mysql 資料庫查詢-動態組裝mysql

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.