Я работаю с огромной таблицей DB2 (сотни миллионов строк), пытаясь выбрать только те строки, которые соответствуют этому регулярному выражению:
\b\d([- \/\\]?\d){12,15}(\D|$)
(То есть граница слова, за которой следуют от 13 до 16 цифр, разделенных ничем или одним тире, пробелом, косой чертой или обратной косой чертой, за которыми следует либо нецифра, либо конец строки.)
После долгих поисков в Google мне удалось создать следующий SQL:
SELECT idx, comment FROM tblComment
WHERE xmlcast(xmlquery('fn:matches($c,"\b\d([- \/\\]?\d){12,15}(\D|$)")' PASSING comment AS "c") AS INTEGER)=1
Что работает отлично, насколько я могу судить... если не находит строку с недопустимым символом:
В выражении SQL/XML или аргументе функции, начинающемся [...]
Данные содержат много недопустимых XML-символов, и изменение данных невозможно (у меня ограничен доступ только для чтения, и слишком много строк нужно исправить). Есть ли способ удалить или игнорировать недопустимые символы без предварительного изменения базы данных? Или есть другой способ написать мой запрос, который имеет тот же эффект?