【问题标题】:How to prevent illegal characters error in DB2 SQL query?如何防止 DB2 SQL 查询中出现非法字符错误?
【发布时间】:2016-02-24 21:58:59
【问题描述】:

我正在处理一个巨大的 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

据我所知,这非常有效......除非它找到带有非法字符的行:

在以字符串 [...] 开头的 SQL/XML 表达式或函数参数中发现非法 XML 字符“#x3”

数据包含许多非法 XML 字符,不能更改数据(我的只读访问权限有限,需要修复的行太多)。有没有办法去除或忽略非法字符,而无需先修改数据库?或者,我是否有不同的方式来编写具有相同效果的查询?

【问题讨论】:

  • 你的数据库的代码页是什么?
  • 我……不知道。我是一个 DB2 菜鸟,而且我无法控制并且很少访问数据库。有没有我可以运行的查询?明天早上我回到办公室后就可以运行它。
  • 代码集和代码页可以像这样查询 select * from sysibmadm.dbcfg where name like 'code%' 否则询问您的 DBA
  • 代码页:1252;代码集:IBM-1252

标签: regex db2 illegal-characters


【解决方案1】:

您必须确定数据中出现的所有非法 XML 字符。一旦你知道它们,你就可以在模式匹配过程中使用TRANSLATE() 函数来消除它们。

假设您确定所有 ASCII 控制字符(0x00 到 0x0F 和 0x7F)都可能出现在 COMMENT 列中。您的查询可能如下所示:

SELECT idx, comment FROM tblComment
WHERE xmlcast(xmlquery(
  'fn:matches($c,"\b\d([- \/\\]?\d){12,15}(\D|$)")' 
  PASSING TRANSLATE(comment, ' ', x'01020304050607080B0C0F7F') AS "c") 
AS INTEGER)=1

所有合法 XML 字符都是listed in the manual。例如,0x09、0x0A 和 0x0D 是合法的,因此您不需要TRANSLATE() 它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2021-12-25
    • 2013-11-27
    • 2021-12-15
    相关资源
    最近更新 更多