【问题标题】:Oracle SQL find missing sequence in varchar2 fieldOracle SQL 在 varchar2 字段中找到缺失的序列
【发布时间】:2017-10-05 22:50:19
【问题描述】:

我是 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  

提前感谢您的帮助

【问题讨论】:

  • 我们可以假设最小值和最大值是在您的表中已经存在的值中定义的吗?你知道如何使用正则表达式吗?我相信我们可以做到这一点...
  • 我不熟悉 RegEx,但我会查找并阅读以熟悉它。谢谢你的问题。最小值最大值没有具体定义,它们必须由字段的最后 6 个字符确定。

标签: sql oracle


【解决方案1】:

SQL Fiddle

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

Results

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

【讨论】:

  • MT0,非常感谢。非常好。我会在星期一试一试。你所做的一些事情对我来说并不熟悉,但我正在调查你所做的事情。非常感谢。
猜你喜欢
  • 2014-06-29
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多