select a.* ,(select count(*) from jacky.ws_sheettreemsg b where a.nodecode=substring(b.nodecode,1,length(a.nodecode)) and b.moduletype=1 and length( replace(replace(replace(b.nodecode, '0000 ', '@ '), '@00 ', ' '), '@ ', ' '))=length(a.nodecode)+2) as count from (select replace(replace(replace(nodecode, '0000 ', '@ '), '@00 ', ' '), '@ ', ' ') as nodecode, nodename,sqlfilter,isfilllist,listid from jacky.ws_sheettreemsg where moduletype=1) as a where length(replace(replace(replace(nodecode, '0000 ', '@ '), '@00 ', ' '), '@ ', ' '))=2 order by nodecode
上述SQL语句在SQLSever下能通过,在DB2下就报错:
SQL0440N 未找到类型为 "FUNCTION " 命名为 "SUBSTRING "
且具有兼容自变量的已授权例程。 SQLSTATE=42884
解释:
当数据库管理器找不到可用来实现引用的例程时,若引用例程
" <例程名> ",则会发生此错误。引起此错误的原因有下列几个:
o " <例程名> " 未正确指定或者在数据库中不存在。
o 进行了限定引用,但不正确地指定了限定符。
o 用户的 SQL
路径不包含期望的函数或方法所属的模式,且使用了一个非限定引用。
o 包括了错误的自变量数。
o 函数或方法引用中包括正确数目的自变量,但是一个或多个自变量的数
据类型不正确。
o 例程不存在于具有在绑定程序包时使用的相同函数标识的数据库中(适
用于静态语句)。
o 找不到与 UPDATE 语句中所使用的属性赋值相对应的更换方法。
该属性的新值的数据类型与该属性的数据类型不同,或者不是可提升为
该属 性的数据类型的数据类型。
o 例程调用者无权执行该例程。
请问改如何解决
------解决方案--------------------------------------------------------
在db2里面叫substr
具体使用发放参见信息中心中的sqlreference
PS:这个SQL的执行效率真是。。。。。
------解决方案--------------------------------------------------------
length(replace(replace(replace(nodecode, '0000 ', '@ '), '@00 ', ' '), '@ ', ' '))=2
这个挺有趣的,琢磨了一下,
这个是不是找符合:?000000?,或者 ??000000,000000?? 的情况?
? 还不能等于0 .
好像没法优化,用了这个函数后 不会去使用索引了,但是 要是 like '?000000? '
的话,也不会使用所以了哦。。