繁体   English   中英

Oracle SQL在varchar2字段中找到丢失的序列

[英]Oracle SQL find missing sequence in varchar2 field

我是oracle和这个论坛的新手。 我已经搜索并找到了关于如何使用仅一列数字执行此操作的答案,但这在开头是txt,然后是序列号。

我有一个表,该表具有一个名为myid的varchar2列,该列的末尾带有一个数字,该字符的顺序是末尾的数字始终为6位,且前导零。

Hello_002190  
Hello_002188  
Bye_000187  
Bye_000185  
Bye_000184  
Get_008133  
Get_008131  
Gone_001112  
Gone_001110  
Gone_001109  

我需要一个Oracle SQL脚本,该脚本将向我显示所有缺少的行。 以上结果应为:

Hello_002189  
Bye_000186  
Get_008132  
Gone_001111  

先谢谢您的帮助

SQL小提琴

Oracle 11g R2架构设置

CREATE TABLE table_name ( value ) AS
SELECT 'Hello_002190' FROM DUAL UNION ALL
SELECT 'Hello_002188' FROM DUAL UNION ALL
SELECT 'Bye_000187' FROM DUAL UNION ALL
SELECT 'Bye_000185' FROM DUAL UNION ALL
SELECT 'Bye_000184' FROM DUAL UNION ALL
SELECT 'Get_008133' FROM DUAL UNION ALL
SELECT 'Get_008131' FROM DUAL UNION ALL
SELECT 'Gone_001112' FROM DUAL UNION ALL  
SELECT 'Gone_001110' FROM DUAL UNION ALL  
SELECT 'Gone_001109' FROM DUAL;

查询1

WITH data ( prefix, suffix ) AS (
  SELECT SUBSTR( value, 1, INSTR( value, '_' ) ),
         TO_NUMBER( SUBSTR( value, INSTR( value, '_' ) + 1 ) )
  FROM   table_name
),
bounds ( prefix, min_suffix, max_suffix ) AS (
  SELECT prefix, MIN( suffix ), MAX( suffix )
  FROM   data
  GROUP BY prefix
)
SELECT prefix || TO_CHAR( column_value, 'FM000000' ) AS missing_value
FROM   bounds b
       CROSS JOIN
       TABLE(
         CAST(
           MULTISET(
             SELECT b.min_suffix + LEVEL - 1
             FROM   DUAL
             CONNECT BY b.min_suffix + LEVEL - 1 <= b.max_suffix
           ) AS SYS.ODCINUMBERLIST
         )
       )
MINUS
SELECT value FROM table_name

结果

| MISSING_VALUE |
|---------------|
|    Bye_000186 |
|    Get_008132 |
|   Gone_001111 |
|  Hello_002189 |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM