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

问题描述 投票:0回答:1

我最近遇到了几个值,这些值在我们的应用程序中引起异常。查看数据库后发现,我们可能导入了错误的数据(不得修改!)。现在,我们发现此错误的原因在于unicode问题。

为了找到所有相关的错误记录,我转储了已经(手动)识别的值,可以看到有问题的值在值96之上,下面是一个示例:

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

而219,190,159是有问题的。这可以通过select dump(col) from table获得,但是我只想进一步选择转储中的值之一超过99的记录-非常像(pseudo codelength(string(value)) for value in dump_record > 96做到这一点的方法?谢谢大家。

sql oracle
1个回答
0
投票

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

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>
© www.soinside.com 2019 - 2024. All rights reserved.