この正規表現に一致する行のみを選択しようとして、巨大な DB2 テーブル (数億行) を使用しています。
\b\d([- \/\\]?\d){12,15}(\D|$)
(つまり、単語境界の後に、何もないか、単一のダッシュ、スペース、スラッシュ、またはバックスラッシュで区切られた 13 から 16 桁の数字が続き、その後に非数字または行末が続きます。)
多くのグーグル検索の後、次の 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
私が知る限り、これは完全に機能します...不正な文字を含む行が見つからない限り:
無効な XML 文字「#x3」が、文字列で始まる SQL/XML 式または関数の引数で見つかりました [...]
データには不正な XML 文字が多数含まれており、データを変更することはできません (私は読み取り専用アクセスを制限しており、修正が必要な行が多すぎます)。最初にデータベースを変更せずに、不正な文字を削除または無視する方法はありますか? または、同じ効果を持つクエリを作成する別の方法はありますか?