DB2查询十六进制值

时间:2016-10-17 16:51:55

标签: db2 hex sql-like

使用DB2 10.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%';

关于如何查询十六进制值的任何指针?我试图单独执行每个十六进制值,因为我不知道如何做范围。如果有办法做范围,那将是一个更好的解决方案。

2 个答案:

答案 0 :(得分:1)

所以我得到了以下工作:

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'), '%');

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

答案 1 :(得分:1)

毒液变化很小

  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' || '%';