您当前位置:主页 > 资讯攻略 >
来源:未知
2022-01-14 13:18:50 浏览: 分类:资讯攻略

用SQL语句求排除断号的号码串

1.用户在日常支付报表中询问账单号的使用情况,希望以类似于5-6、9-10、12-20的方式展示,直观反映账单号的实际使用情况。

经过分析,我们发现实现这一需求主要有两个难点:

1.如果要找出断数并用SQL语句实现,主要考虑性能;

2.将排除断号段的多条记录转换成一行显示,即用SQL实现行列转换;

如果是用编程实现,这两点都不难,但如果是用SQL实现,就需要一些技巧了。

假设使用的票据编号为3、4、5、7、8、11、12,最小为3,最大为12,查找断号的SQL如下:

选择Rownum + (3 - 1)

从双重

通过Rownum & lt= 12 - (3 - 1)

负的

从表中选择Column _ Value Txt(Cast(zltools . f _ num 2 list(' 3,4,5,7,8,11,12') As Zltools.t_Numlist))

结果是三个记录,6、9和10。

使用的技术之一是使用Connect by Rownum来生成按顺序增长的记录集。

转换成一行显示的已用账单段的SQL如下:

测试为(

select _ value number from table(cast(zltools . f _ num 2 list(' 3,4,5,7,8,11,12') as zltools.t _ numlist))

)

选择Substr(Max(LPAD(长度(段),5,' 0') ||段),7,1000)作为段

来自(

Select _ connect _ by _ path (segment,',')作为段

来自(

选择Rownum作为行号,a .起始号||'-'|| (b .中断号-1)作为段

来自(

选择Rownum作为行号,number作为起始号

来自(

从测试中选择号码

负的

从测试中选择数字+1)

)A,

(选择Rownum作为行号,number作为中断号来自(

从测试中选择数字+1作为数字

负的

从测试中选择)

)B

A.行号= B .行号)

从行号= 1开始

连接方式(行号-1) =前一个行号)

结果:3-5,7-8,11-12

使用了以下技术:

1.用减号的方式找到所用号段的起始号和结束号的记录集。

2.利用Sys_Connect_By_Path函数和树形查询实现多行记录到一列的转换。

3.使用substr、max、lpad和length函数的组合来查找最长的记录。

如果是oracle 10G或更高版本,可以使用一个新函数Wmsys。Wm_Concat,比之前的树查询快多了。

测试为(

select _ value number from table(cast(zltools . f _ num 2 list(' 3,4,5,7,8,11,12') as zltools.t _ numlist))

)

选择Wmsys。Wm_Concat(分段)作为分段

来自(

选择Rownum作为行号,a .起始号||'-'|| (b .中断号-1)作为段

来自(

选择Rownum作为行号,number作为起始号

来自(

从测试中选择号码

负的

从测试中选择数字+1)

)A,

(选择Rownum作为行号,number作为中断号来自(

从测试中选择数字+1作为数字

负的

从测试中选择)

)B

A.行号= B .行号)

关键词:SQL语句

优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。

本文链接:http://www.123down.cn/gonglue/227157.html

攻略资讯
安卓软件