iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
佛心分享-我的私藏工具箱

正則!好好表達系列 第 29

如何給Select出來的記錄加編號,以便分批Select

  • 分享至 

  • xImage
  •  

第29天了,挖出十幾年前的筆記,不知迄今是否適用。
需求:利用Regex replace替原有的SQL加一個rownum編號名為abc的欄位,再將該SQL當作一個子查詢被from包起來,就可以對abc欄位做between動作。
以Java為例:

  • Oracle
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 取代,然後變成子查詢。

  • MSSQL
    在SQL Server的Solution就囉唆許多
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秒


上一篇
用Perl產出過版清單貼上Excel
下一篇
DAYS.matches("文{30}")
系列文
正則!好好表達30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言