成人在线你懂的-成人在线免费小视频-成人在线免费网站-成人在线免费视频观看-日韩精品国产一区二区-日韩精品国产一区

掃一掃
關(guān)注微信公眾號(hào)

如何用SQL語(yǔ)句求排除斷號(hào)的號(hào)碼串
2010-03-01   網(wǎng)絡(luò)

一用戶(hù)對(duì)繳款日?qǐng)?bào)中的票據(jù)號(hào)使用情況提出要求,希望以類(lèi)似5-6,9-10,12-20的方式展現(xiàn),以便直觀地反映實(shí)際使用的票據(jù)號(hào)情況。

  我們經(jīng)過(guò)分析發(fā)現(xiàn),實(shí)現(xiàn)這一需求的難點(diǎn)主要有兩點(diǎn):

  1. 如果要找出斷號(hào),用SQL語(yǔ)句實(shí)現(xiàn),主要是要考慮性能;

  2. 將排除斷后的使用號(hào)碼段的多條記錄轉(zhuǎn)換為一行顯示,即用SQL實(shí)現(xiàn)行列轉(zhuǎn)換;

  如果通過(guò)編程來(lái)實(shí)現(xiàn),這兩點(diǎn)都不難,但通過(guò)SQL來(lái)實(shí)現(xiàn),則需要一些技巧。

  假設(shè)知道已用票據(jù)號(hào)為3,4,5,7,8,11,12,最小為3,最大為12,求斷號(hào)的SQL如下:

 


Select Rownum + (3 - 1)
From Dual
Connect By Rownum <= 12 - (3 - 1)
Minus
Select Column_Value Txt From Table(Cast(Zltools.f_Num2list('3,4,5,7,8,11,12') As Zltools.t_Numlist))

  求出的結(jié)果是三條記錄,6,9,10

  其中用到一個(gè)技巧就是用Connect by Rownum來(lái)產(chǎn)生按順序增長(zhǎng)的記錄集。

  求轉(zhuǎn)換為一行顯示的已用票據(jù)段的SQL如下:

 


With TEST As(
Select Column_Value 編 號(hào) From Table(Cast(Zltools.f_Num2list('3,4,5,7,8,11,12') As Zltools.t_Numlist))
)
Select Substr(Max(LPAD(Length(分段), 5,'0') || 分 段), 7, 1000) As 分段
From (
Select Sys_Connect_By_Path(分 段, ',') As 分段
From (
Select Rownum As 行號(hào),A.起始號(hào)||'-'||(B.中斷號(hào) -1) As 分段
From (
Select Rownum As 行號(hào),編號(hào) As 起始號(hào)
From (
Select 編號(hào) From TEST
Minus
Select 編號(hào)+1 From TEST)
) A,
(Select Rownum As 行號(hào),編號(hào) As 中斷號(hào) From (
Select 編號(hào)+1 As 編 號(hào) From TEST
Minus
Select 編號(hào) From TEST)
) B
Where A.行號(hào)=B.行號(hào))
Start With 行號(hào) = 1
Connect By (行號(hào) -1) = Prior 行號(hào))

 查詢(xún)結(jié)果: 3-5,7-8,11-12

  其中用到以下技巧:

  1. 用minus方式求已用號(hào)碼段的起始號(hào)和終止號(hào)的記錄集

  2. 用Sys_Connect_By_Path函數(shù)和樹(shù)型查詢(xún)實(shí)現(xiàn)多行記錄轉(zhuǎn)換為一列

  3. 用Substr,Max,LPAD,Length幾個(gè)函數(shù)的組合來(lái)求最長(zhǎng)的一條記錄

  如是Oracle 10G及以后的版本,可以使用一個(gè)新的函數(shù)Wmsys.Wm_Concat,比前面樹(shù)型查詢(xún)的速度要快很多。

 


   With TEST As(


  Select Column_Value 編 號(hào) From Table(Cast(Zltools.f_Num2list('3,4,5,7,8,11,12') As Zltools.t_Numlist))


  )


  Select Wmsys.Wm_Concat(分段) as 分段


  From (


   Select Rownum As 行號(hào),A.起始號(hào)||'-'||(B.中斷號(hào)-1) As 分段


  From (


   Select Rownum As 行號(hào),編號(hào) As 起始號(hào)


  From (


  Select 編號(hào) From TEST


   Minus


  Select 編號(hào)+1 From TEST)


  ) A,


  (Select Rownum As 行 號(hào),編號(hào) As 中斷號(hào) From (


  Select 編號(hào)+1 As 編號(hào) From TEST


  Minus


   Select 編號(hào) From TEST)


  ) B


  Where A.行號(hào)=B.行號(hào))

熱詞搜索:

上一篇:新調(diào)度算法可減少數(shù)據(jù)中心能源消耗
下一篇:關(guān)于SQL Server群集的幾個(gè)關(guān)鍵技巧

分享到: 收藏
主站蜘蛛池模板: silk铃木一彻| 电影英雄| 深流 电视剧| 38在线电影| 小黑电影| 美少女之恋| 08版包青天狸猫换太子| 桥梁工程师职称论文| 我妻子的一切 电影| 循环小数除法50道| 小林凉子| 重启之极海听雷2免费版在线播放| 暗夜尖叫1988美国版高清观看| 芝加哥警署第十一季| 王盼盼| 守护大电影| 湖南卫视节目表今天| 敬天法祖| 风筝 电影| 削发| 误杀2剧情| 豪勇七蛟龙 电影| 西湖地图| 天下无贼果宝特攻| 荒笛子简谱| 黄视频免费观看网站| accesscode在线播放| 朴信惠电视剧| 极寒风暴电影| 盛健| 播放哪吒| 决胜法庭演员表| 霹雳俏娇娃| 动漫秀场| 咸猪手| 车震电影| 张柏芝艳照无删减| 荒岛求生2005美版| 得闲谨制| 创业史全文免费阅读| 时事新闻摘抄|