国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

如何用SQL語句求排除斷號的號碼串
2010-03-01   網絡

一用戶對繳款日報中的票據號使用情況提出要求,希望以類似5-6,9-10,12-20的方式展現,以便直觀地反映實際使用的票據號情況。

  我們經過分析發現,實現這一需求的難點主要有兩點:

  1. 如果要找出斷號,用SQL語句實現,主要是要考慮性能;

  2. 將排除斷后的使用號碼段的多條記錄轉換為一行顯示,即用SQL實現行列轉換;

  如果通過編程來實現,這兩點都不難,但通過SQL來實現,則需要一些技巧。

  假設知道已用票據號為3,4,5,7,8,11,12,最小為3,最大為12,求斷號的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))

  求出的結果是三條記錄,6,9,10

  其中用到一個技巧就是用Connect by Rownum來產生按順序增長的記錄集。

  求轉換為一行顯示的已用票據段的SQL如下:

 


With TEST As(
Select Column_Value 編 號 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 行號,A.起始號||'-'||(B.中斷號 -1) As 分段
From (
Select Rownum As 行號,編號 As 起始號
From (
Select 編號 From TEST
Minus
Select 編號+1 From TEST)
) A,
(Select Rownum As 行號,編號 As 中斷號 From (
Select 編號+1 As 編 號 From TEST
Minus
Select 編號 From TEST)
) B
Where A.行號=B.行號)
Start With 行號 = 1
Connect By (行號 -1) = Prior 行號)

 查詢結果: 3-5,7-8,11-12

  其中用到以下技巧:

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

  2. 用Sys_Connect_By_Path函數和樹型查詢實現多行記錄轉換為一列

  3. 用Substr,Max,LPAD,Length幾個函數的組合來求最長的一條記錄

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

 


   With TEST As(


  Select Column_Value 編 號 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 行號,A.起始號||'-'||(B.中斷號-1) As 分段


  From (


   Select Rownum As 行號,編號 As 起始號


  From (


  Select 編號 From TEST


   Minus


  Select 編號+1 From TEST)


  ) A,


  (Select Rownum As 行 號,編號 As 中斷號 From (


  Select 編號+1 As 編號 From TEST


  Minus


   Select 編號 From TEST)


  ) B


  Where A.行號=B.行號)

熱詞搜索:

上一篇:新調度算法可減少數據中心能源消耗
下一篇:關于SQL Server群集的幾個關鍵技巧

分享到: 收藏
主站蜘蛛池模板: 武功县| 龙海市| 张家界市| 贡嘎县| 交城县| 垫江县| 嘉义市| 无为县| 周宁县| 哈密市| 东莞市| 霞浦县| 兴隆县| 华坪县| 仁化县| 阿拉善盟| 达拉特旗| 手游| 云梦县| 丹阳市| 永善县| 特克斯县| 洛阳市| 板桥市| 简阳市| 西林县| 镇巴县| 北碚区| 内江市| 英山县| 东兴市| 永兴县| 安龙县| 琼海市| 万宁市| 洛扎县| 赞皇县| 青浦区| 安福县| 渝中区| 威宁|