如何防止 DB2 SQL 查询中的非法字符错误?
How to prevent illegal characters error in DB2 SQL query?
我正在使用一个巨大的 DB2 table(数亿行),试图 select 仅与此正则表达式匹配的行:
\b\d([- \/\]?\d){12,15}(\D|$)
(即,单词边界,后跟 13 到 16 位数字,中间没有分隔符或单破折号、space、斜杠或反斜杠,后跟非数字或结尾行。)
经过多次谷歌搜索,我设法创建了以下内容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
据我所知,它工作得很好......除非它找到包含非法字符的行:
An illegal XML character "#x3" was found in an SQL/XML expression or function argument that begins with string [...]
数据包含许多非法 XML 字符,更改数据不是一种选择(我的只读访问权限有限,需要修复的行太多)。有没有办法在不首先修改数据库的情况下删除或忽略非法字符?或者,是否有其他方法可以让我编写具有相同效果的查询?
您必须确定数据中出现的所有非法 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()
它们,例如。
我正在使用一个巨大的 DB2 table(数亿行),试图 select 仅与此正则表达式匹配的行:
\b\d([- \/\]?\d){12,15}(\D|$)
(即,单词边界,后跟 13 到 16 位数字,中间没有分隔符或单破折号、space、斜杠或反斜杠,后跟非数字或结尾行。)
经过多次谷歌搜索,我设法创建了以下内容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
据我所知,它工作得很好......除非它找到包含非法字符的行:
An illegal XML character "#x3" was found in an SQL/XML expression or function argument that begins with string [...]
数据包含许多非法 XML 字符,更改数据不是一种选择(我的只读访问权限有限,需要修复的行太多)。有没有办法在不首先修改数据库的情况下删除或忽略非法字符?或者,是否有其他方法可以让我编写具有相同效果的查询?
您必须确定数据中出现的所有非法 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()
它们,例如。