SQL查询:其中任何转储值都大于96



我最近遇到了几个值,这些值在我们的应用程序中导致异常。对数据库的调查表明,我们可能导入了错误的数据(不能修改!(。我们现在发现这个错误的原因在于unicode问题。

为了找到所有相关的错误记录,我转储了我已经识别的值(手动(,并且可以看到,有问题的值位于值96之上,示例如下:

Typ=96 Len=10: 83,85,49,89,36,73,219,190,159,87

而219190159是有问题的。这可以通过select dump(col) from table获得,但我想进一步只选择转储中的一个值超过99的记录——很像(伪代码(length(string(value)) for value in dump_record > 96有什么方法可以做到这一点吗?谢谢各位。

这就是我理解这个问题的方式。看看它是否有帮助;遵循代码中的注释:

SQL> with
  2  data (col) as
  3     -- sample data:
  4     -- 123LITTlefOOT results in Typ=96 Len=13: 49,50,51,76,73,84,84,108,101,102,79,79,84
  5     -- where marked values are > 96                                 --- --- ---
  6     --
  7     -- BIG997FOOT    results in Typ=96 Len=10: 66,73,71,57,57,55,70,79,79,84 which is OK
  8    (select '123LITTlefOOT' from dual union all
  9     select 'BIG997FOOT'    from dual
 10    ),
 11  test as
 12    -- DUMP of sample data
 13    (select col,
 14            dump(col) dmp
 15     from data
 16    ),
 17  -- remove TYP=XX Len=yy
 18  test2 as
 19    (select col,
 20            dmp,
 21            trim(substr(dmp, instr(dmp, ':') + 1)) tdmp
 22     from test
 23    ),
 24  -- split TDMP into rows
 25  trows as
 26    (select col,
 27            dmp,
 28            regexp_substr(tdmp, '[^,]+', 1, column_value) str
 29     from test2 cross join table(cast(multiset(select level from dual
 30                                               connect by level <= regexp_count(tdmp, ',') + 1
 31                                              ) as sys.odcinumberlist))
 32    )
 33  select distinct col, dmp
 34  from trows
 35  where to_number(str) > 96;
COL           DMP
------------- ------------------------------------------------------------
123LITTlefOOT Typ=1 Len=13: 49,50,51,76,73,84,84,108,101,102,79,79,84
SQL>

Regex完全做到了,我使用了以下简单的解决方案:

SELECT t.* FROM table t WHERE regexp_like(dump(t.error_col), 'd{3}');

感谢您的快速回复!

最新更新