惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
The Register - Security
The Register - Security
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Hacker News
The Hacker News
P
Proofpoint News Feed
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
The Last Watchdog
The Last Watchdog
F
Fortinet All Blogs
S
Schneier on Security
Help Net Security
Help Net Security
Security Archives - TechRepublic
Security Archives - TechRepublic
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
I
InfoQ
T
The Blog of Author Tim Ferriss
Cisco Talos Blog
Cisco Talos Blog
Stack Overflow Blog
Stack Overflow Blog
T
Troy Hunt's Blog
人人都是产品经理
人人都是产品经理
T
Threatpost
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
Forbes - Security
Forbes - Security
Vercel News
Vercel News
S
Security Affairs
美团技术团队
P
Privacy & Cybersecurity Law Blog
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Jina AI
Jina AI
Spread Privacy
Spread Privacy
Attack and Defense Labs
Attack and Defense Labs
IT之家
IT之家
U
Unit 42
Recorded Future
Recorded Future
W
WeLiveSecurity
PCI Perspectives
PCI Perspectives
P
Palo Alto Networks Blog
H
Hacker News: Front Page
S
Security @ Cisco Blogs
博客园 - 【当耐特】

博客园 - 知道得越多知道的越少

window10上登录Oracle时提示ORA-12546:Permission denied 大表的主键创建优化技术(转一篇有深度的文章) Oracle并行执行特性应用初探 解决Rhel5上安装VMWare tools的问题 Oracle 性能诊断艺术 第四章 笔记 Oracle国外站点汇集 在客户端通过外部表访问Trace文件的内容 查出全表扫描的相关SQL语句 SQL条件的顺序对性能的影响 易用性规范 64位Oracle数据库环境下安装使用32位的PLSQL-Developer 使用Pivot进行行列转换不能合并为一行的问题 删除Oracle程序,重装后遇到的两个小问题 闪回查询,9i,10G到11G的不断增强 归档日志充满的问题解决 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 问题解决 生成SQL记录集的一些数据 导入的数据,删除约束后没有自动删除对应索引,重建约束出错 如何取出某一用户的密码,再原封不动的改回去?
用SQL语句求排除断号的号码串
知道得越多知道的越少 · 2009-08-23 · via 博客园 - 知道得越多知道的越少

一用户对缴款日报中的票据号使用情况提出要求,希望以类似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.行号)