第29天了,挖出十幾年前的筆記,不知迄今是否適用。
需求:利用Regex replace替原有的SQL加一個rownum編號名為abc的欄位,再將該SQL當作一個子查詢被from包起來,就可以對abc欄位做between動作。
以Java為例:
String sql = sql.replaceFirst("(?i:select (.+?) from) ", "select rownum as abc, $1 from ");
sql = "select * from (" + sql + ") where abc between ? and ?";
重點在(?i:select (.+?) from)
以select rownum as abc, $1 from
取代,然後變成子查詢。
String sql = sql.replaceFirst("(?i:select (.+?) from) ", "select identity(int,1,1) as abc, $1 into #tmpTable from ");
sql = "select * from #tmpTable where abc between ? and ?";
然後先執行產生#tmpTable,再查詢#tmpTable,原理和Oracle一樣,但identity涵數需要與into配合。讀取後還要記得刪掉temp table。而我是使用SQL2005 Express版本,有個限制是同時間只有建一個temp table,亦即在multi thread情形下只有第一個thread會建成功,即使temp table名稱不同。
另外,between 1 and 100與between 1000001 and 1000100之間效能差距甚大,約0.025秒比25秒