十六进制值的DB2查询

十六进制值的DB2查询,db2,hex,sql-like,Db2,Hex,Sql Like,使用DB2Version10.5。我有一个数据库表,我知道它至少有一行包含错误的xml数据,这会影响我正在尝试执行的一些其他查询。其中一行中有一个#x1A字符。我试图找到一种方法来执行查询,该查询将为我提供所有包含无效xml字符[#x0E-#x1F]的行。下面是我尝试过的几次尝试,但都没有成功 SELECT e.EMLNAME FROM MYDB.EMPLOYEE e WHERE -- [#x0E-#x1F] /* e.EMLNAME like '%#x0E%' OR e.E

使用DB2Version10.5。我有一个数据库表,我知道它至少有一行包含错误的xml数据,这会影响我正在尝试执行的一些其他查询。其中一行中有一个#x1A字符。我试图找到一种方法来执行查询,该查询将为我提供所有包含无效xml字符[#x0E-#x1F]的行。下面是我尝试过的几次尝试,但都没有成功

SELECT
  e.EMLNAME
FROM MYDB.EMPLOYEE e
WHERE
  -- [#x0E-#x1F]
  /*
  e.EMLNAME like '%#x0E%'
  OR e.EMLNAME like '%#x0F%'
  OR e.EMLNAME like '%#x10%'
  OR e.EMLNAME like '%#x11%'
  OR e.EMLNAME like '%#x12%'
  OR e.EMLNAME like '%#x13%'
  OR e.EMLNAME like '%#x14%'
  OR e.EMLNAME like '%#x15%'
  OR e.EMLNAME like '%#x16%'
  OR e.EMLNAME like '%#x17%'
  OR e.EMLNAME like '%#x18%'
  OR e.EMLNAME like '%#x19%'
  OR e.EMLNAME like '%#x1A%'
  OR e.EMLNAME like '%#x1B%'
  OR e.EMLNAME like '%#x1C%'
  OR e.EMLNAME like '%#x1D%'
  OR e.EMLNAME like '%#x1E%'
  OR e.EMLNAME like '%#x1F%';

  e.EMLNAME like '%\x0E%'
  OR e.EMLNAME like '%\x0F%'
  OR e.EMLNAME like '%\x10%'
  OR e.EMLNAME like '%\x11%'
  OR e.EMLNAME like '%\x12%'
  OR e.EMLNAME like '%\x13%'
  OR e.EMLNAME like '%\x14%'
  OR e.EMLNAME like '%\x15%'
  OR e.EMLNAME like '%\x16%'
  OR e.EMLNAME like '%\x17%'
  OR e.EMLNAME like '%\x18%'
  OR e.EMLNAME like '%\x19%'
  OR e.EMLNAME like '%\x1A%'
  OR e.EMLNAME like '%\x1B%'
  OR e.EMLNAME like '%\x1C%'
  OR e.EMLNAME like '%\x1D%'
  OR e.EMLNAME like '%\x1E%'
  OR e.EMLNAME like '%\x1F%';

  e.EMLNAME like '%\0x0E%'
  OR e.EMLNAME like '%\0x0F%'
  OR e.EMLNAME like '%\0x10%'
  OR e.EMLNAME like '%\0x11%'
  OR e.EMLNAME like '%\0x12%'
  OR e.EMLNAME like '%\0x13%'
  OR e.EMLNAME like '%\0x14%'
  OR e.EMLNAME like '%\0x15%'
  OR e.EMLNAME like '%\0x16%'
  OR e.EMLNAME like '%\0x17%'
  OR e.EMLNAME like '%\0x18%'
  OR e.EMLNAME like '%\0x19%'
  OR e.EMLNAME like '%\0x1A%'
  OR e.EMLNAME like '%\0x1B%'
  OR e.EMLNAME like '%\0x1C%'
  OR e.EMLNAME like '%\0x1D%'
  OR e.EMLNAME like '%\0x1E%'
  OR e.EMLNAME like '%\0x1F%';
  */

  e.EMLNAME like '%0x0E%'
  OR e.EMLNAME like '%0x0F%'
  OR e.EMLNAME like '%0x10%'
  OR e.EMLNAME like '%0x11%'
  OR e.EMLNAME like '%0x12%'
  OR e.EMLNAME like '%0x13%'
  OR e.EMLNAME like '%0x14%'
  OR e.EMLNAME like '%0x15%'
  OR e.EMLNAME like '%0x16%'
  OR e.EMLNAME like '%0x17%'
  OR e.EMLNAME like '%0x18%'
  OR e.EMLNAME like '%0x19%'
  OR e.EMLNAME like '%0x1A%'
  OR e.EMLNAME like '%0x1B%'
  OR e.EMLNAME like '%0x1C%'
  OR e.EMLNAME like '%0x1D%'
  OR e.EMLNAME like '%0x1E%'
  OR e.EMLNAME like '%0x1F%';

有关于如何查询十六进制值的指针吗?我试着分别做每一个十六进制值,因为我不知道如何做一个范围。如果有一种方法可以做一个范围,那将是一个更好的解决方案。

所以我做了以下工作:

SELECT
  e.EMLNAME
FROM MYDB.EMPLOYEE e
WHERE
  e.EMLNAME like CONCAT(CONCAT('%', x'0E'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'0F'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'10'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'11'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'12'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'13'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'14'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'15'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'16'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'17'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'18'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'19'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1A'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1B'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1C'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1D'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1E'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1F'), '%');

发布答案,让其他人知道我在寻找什么。我会等一会儿看是否有人能想出一个更干净的解决方案。如果他们这样做了,我会接受这个答案。

所以我做了以下工作:

SELECT
  e.EMLNAME
FROM MYDB.EMPLOYEE e
WHERE
  e.EMLNAME like CONCAT(CONCAT('%', x'0E'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'0F'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'10'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'11'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'12'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'13'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'14'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'15'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'16'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'17'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'18'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'19'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1A'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1B'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1C'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1D'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1E'), '%')
  OR e.EMLNAME like CONCAT(CONCAT('%', x'1F'), '%');

发布答案,让其他人知道我在寻找什么。我会等一会儿看是否有人能想出一个更干净的解决方案。如果他们这样做了,我会接受这个答案。

毒液的微小变化

  SELECT e.EMLNAME FROM MYDB.EMPLOYEE e
  WHERE
  e.EMLNAME like '%' || x'0E' || '%'
  OR e.EMLNAME like '%' || x'0F' || '%'
  OR e.EMLNAME like '%' || x'10' || '%'
  OR e.EMLNAME like '%' || x'11' || '%'
  OR e.EMLNAME like '%' || x'12' || '%'
  OR e.EMLNAME like '%' || x'13' || '%'
  OR e.EMLNAME like '%' || x'14' || '%'
  OR e.EMLNAME like '%' || x'15' || '%'
  OR e.EMLNAME like '%' || x'16' || '%'
  OR e.EMLNAME like '%' || x'17' || '%'
  OR e.EMLNAME like '%' || x'18' || '%'
  OR e.EMLNAME like '%' || x'19' || '%'
  OR e.EMLNAME like '%' || x'1A' || '%'
  OR e.EMLNAME like '%' || x'1B' || '%'
  OR e.EMLNAME like '%' || x'1C' || '%'
  OR e.EMLNAME like '%' || x'1D' || '%'
  OR e.EMLNAME like '%' || x'1E' || '%'
  OR e.EMLNAME like '%' || x'1F' || '%';

毒液变异小

  SELECT e.EMLNAME FROM MYDB.EMPLOYEE e
  WHERE
  e.EMLNAME like '%' || x'0E' || '%'
  OR e.EMLNAME like '%' || x'0F' || '%'
  OR e.EMLNAME like '%' || x'10' || '%'
  OR e.EMLNAME like '%' || x'11' || '%'
  OR e.EMLNAME like '%' || x'12' || '%'
  OR e.EMLNAME like '%' || x'13' || '%'
  OR e.EMLNAME like '%' || x'14' || '%'
  OR e.EMLNAME like '%' || x'15' || '%'
  OR e.EMLNAME like '%' || x'16' || '%'
  OR e.EMLNAME like '%' || x'17' || '%'
  OR e.EMLNAME like '%' || x'18' || '%'
  OR e.EMLNAME like '%' || x'19' || '%'
  OR e.EMLNAME like '%' || x'1A' || '%'
  OR e.EMLNAME like '%' || x'1B' || '%'
  OR e.EMLNAME like '%' || x'1C' || '%'
  OR e.EMLNAME like '%' || x'1D' || '%'
  OR e.EMLNAME like '%' || x'1E' || '%'
  OR e.EMLNAME like '%' || x'1F' || '%';

较新版本的DB2有一个类似REGEXP_()的函数,它允许在一次搜索中搜索字符的范围或集合。一旦找到它们,您打算做什么?可能您只需
更新MYDB.EMPLOYEE set e.EMLNAME=translate(e.EMLNAME,,,x'1a')
?@mustaccio,计划生成显示错误数据的报告。我的猜测是,企业最终会希望删除坏字符,因此“”而不是“”。我想您仍然可以使用类似于
…where length(translate(e.EMLNAME,,,x'0f0e1a10…)
更新版本的DB2具有类似REGEXP_()的函数,可以搜索范围(s) 或一次搜索中的一组或多组字符。一旦找到它们,您打算做什么?可能您只需
更新MYDB.EMPLOYEE set e.EMLNAME=translate(e.EMLNAME',x'1a')
?@mustaccio,计划有显示坏数据的报告。我猜业务部门最终会希望删除坏字符,因此“”而不是“”。我猜您仍然可以使用
translate()
,类似
…where length(translate(e.EMLNAME,,,x'0f0e1a10…)
concats的更干净版本,thx。我将等待,看看是否有人找到一种方法来创建一个范围,而不是显式列出每个项目。concats的更干净版本,thx。我将等待,看看是否有人找到一种方法来创建一个范围,而不是显式列出每个项目。