1. 程式人生 > >SQL動態語句查詢

SQL動態語句查詢

要實現這種動態的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;
}