SQL動態語句查詢
阿新 • • 發佈:2019-01-25
要實現這種動態的SQL語句拼裝,我們可以在宿主語言中建立一個字串,然後逐個判斷各個複選框是否選中來向這個字串中新增SQL語句片段:
String sql = "select * from employee where 1=1"; if(工號複選框選中) { sql.appendLine("and number between "+工號文字框內容一+"and"+工號文字框內容二); } if(姓名複選框選中) { sql.appendLine("and name like '%"+姓名文字框內容一+"%'"); } if(年齡複選框選中) { sql.appendLine("and age between "+年齡文字框內容一+"and"+年齡文字框內容二); } executeSQL(sql);
這看似非常優美的解決了問題,殊不知這樣很可能會造成非常大的效能損失,因為使用添加了“1=1”的過濾條件以後資料庫系統就無法使用索引等查詢優化策略,資料庫系統將會被迫對每行資料進行掃描(也就是全表掃描)以比較此行是否滿足過濾條件,當表中資料量比較大的時候查詢速度會非常慢。因此如果資料檢索對效能有比較高的要求就不要使用這種“簡便”的方式。下面給出一種參考實現,虛擬碼如下:
private void doQuery() { Boolean hasWhere = false; String sql = "select * from employee"; if(工號複選框選中) { hasWhere = appendWhereIfNeed(sql, hasWhere); sql.appendLine("number between "+工號文字框內容一+"and"+工號文字框內容二); } if(姓名複選框選中) { hasWhere = appendWhereIfNeed(sql, hasWhere); sql.appendLine("name like '%"+姓名文字框內容一+"%'"); } if(年齡複選框選中) { hasWhere = appendWhereIfNeed(sql, hasWhere); sql.appendLine("age between "+年齡文字框內容一+"and"+年齡文字框內容二); } executeSQL(sql); } private Boolean appendWhereIfNeed(StringBuilder sql,Bool hasWhere) { if(hasWhere==false) { sql. appendLine("WHERE"); } else { sql. appendLine("AND"); } return true; }