DB2 实现 ORACLE LIKE 关联

来源:互联网 发布:win2008 r2 数据库 编辑:程序博客网 时间:2024/06/08 07:37

        最近开发的时候遇到了一个问题,是在使用DB2数据库作查询的时候的问题,需求如下:

    

已知下表数据,需要自表关联,找出SUB_VALUE_ID 在 VALUE_PARENT_ID 中的所有记录(即VALUE_PARENT_ID 包含 SUB_VALUE_ID 的记录).


表列:

VALUE_IDINTEGERVALUE_NAMEVARCHAR(100)VALUE_PARENT_IDVARCHAR(100)SUB_VALUE_ID  INTEGER  


表如下:

VALUE_IDVALUE_NAME VALUE_PARENT_ID SUB_VALUE_ID 994AT&T,719,60,60 1282Cricket,61, 61

                                                                                      .

在ORACLE中,这种问题很容易解决,直接关联的时候使用 VALUE_PARENT_ID LIKE '%,' || SUB_VALUE_ID || ',%' 即可,也可以用

INSTR(SUB_VALUE_ID,VALUE_PARENT_ID) <> 0 等其他方法.

但是,在DB2中是不支持关联字段的 LIKE 关联的,如果如ORACLE中写法会报错:

         

[IBM][CLI Driver][DB2/NT] SQL0132N  LIKE 谓词或 POSSTR 标量函数无效,因为第一操作数不是字符串表达式或第二操作数不是字符串。  SQLSTATE=42824

而且,DB2也没有INSTR函数,怎么办呢?

        

经过查询DB2函数, 得知 DB2 中 LOCATE 函数可以实现ORACLE 中 INSTR类似功能,

LOCATE  返回参数2在参数1中的第一次出现的位置


故关联语句可以这样写: LOCATE(',' || CHAR(SUB_VALUE_ID) || ',', VALUE_PARENT_ID) <> 0  .


查询结果:    0 rows......


就这样看,语句是没有问题的,问题只能出在DB2函数那里,LOCATE 没问题, 只可能是 CHAR 函数的问题了,CHAR 函数格式化INTEGER数据时,是按定长的字符格式化的,默认是以 11 位的字符格式化,不足会以空格填充,即当CHAR(60)时,实际上返回的字符串是

60_________  , 这时我们拿这个去和数据作对比是没有结果的,那么知道了问题在哪就好办了.

最后的关联语句的写法是:LOCATE(',' || RTRIM(CHAR(SUB_VALUE_ID)) || ',' , VALUE_PARENT_ID) <> 0 .即可以实现 ORACLE 中的LIKE 关联了.


最后,再说明下,不知道是不是因为DB2 版本问题,TRIM() 函数也是用不了的, 只有 LTRIM() 和 RTRIM() 函数.
      .

      .