最近开发的时候遇到了一个问题,是在使用DB2数据库作查询的时候的问题,需求如下:
已知下表数据,需要自表关联,找出SUB_VALUE_ID 在 VALUE_PARENT_ID 中的所有记录(即VALUE_PARENT_ID 包含 SUB_VALUE_ID 的记录).
表列:
VALUE_ID | INTEGER |
VALUE_NAME | VARCHAR(100) |
VALUE_PARENT_ID | VARCHAR(100) |
SUB_VALUE_ID | INTEGER |
表如下:
VALUE_ID | VALUE_NAME | VALUE_PARENT_ID | SUB_VALUE_ID |
994 | AT&T | ,719,60, | 60 |
1282 | Cricket | ,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中的第一次出现的位置
查询结果: 0 rows......
就这样看,语句是没有问题的,问题只能出在DB2函数那里,LOCATE 没问题, 只可能是 CHAR 函数的问题了,CHAR 函数格式化INTEGER数据时,是按定长的字符格式化的,默认是以 11 位的字符格式化,不足会以空格填充,即当CHAR(60)时,实际上返回的字符串是
60_________ , 这时我们拿这个去和数据作对比是没有结果的,那么知道了问题在哪就好办了.
最后的关联语句的写法是:LOCATE(',' || RTRIM(CHAR(SUB_VALUE_ID)) || ',' , VALUE_PARENT_ID) <> 0 .即可以实现 ORACLE 中的LIKE 关联了.
.
.