SQL запрос: где любое значение дампа больше 96 - PullRequest
0 голосов
/ 06 марта 2020

Недавно я обнаружил пару значений, которые вызывают исключения в нашем приложении. Изучение базы данных показало, что мы могли импортировать ошибочные данные (которые нельзя изменять!). Теперь мы обнаружили, что причина этой ошибки заключается в проблемах Unicode.

Чтобы найти все соответствующие записи об ошибках, я сбросил значения, которые я уже определил (вручную), и увидел, что проблема c vaules l ie выше значения 96, пример ниже:

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

В то время как 219 190 159 являются проблемными c. Это может быть получено через select dump(col) from table, однако я хотел бы дополнительно выбрать только те записи, в которых одно из значений в дампе превышает 99 -почти очень похоже ( псевдокод ) length(string(value)) for value in dump_record > 96 Есть какой-либо способ сделать это? Спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Regex полностью сделал это, я использовал простое решение ниже:

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

Спасибо за быстрые ответы!

0 голосов
/ 06 марта 2020

Вот как я понял вопрос. Посмотрите, поможет ли это; следуйте комментариям в коде:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...