db2存储过程里面可以用like
DB2中的like的使用是有限制的,它不允许跟在它后面的是一个变量或者是字段,目前比较多的是:like '%测试%'这样.
因此,在函数或者是存储过程中,就不能通过窗体一个参数给like来组成动态的条件。
如果真要在函数或者是存储过程中,去搜索某个字段是否拥有某个字符串在里面,可以使用locate。
下面是locate的用法:
locate(arg1,arg2,<pos>):在arg2中查找arg1第一次出现的位置,指定pos,则从arg2的pos处开始找arg1第一次出现的位置。
下面是用该方法时的一个例子:
CREATE FUNCTION GDZJ.GETNOPASS
(ITEMNAME VARCHAR(100),
REPORTTYPE INTEGER,
RESULTID INTEGER
)
RETURNS INTEGER
SPECIFIC GDZJ.SQL091102183311900
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
STATIC DISPATCH
CALLED ON NULL INPUT
EXTERNAL ACTION
INHERIT SPECIAL REGISTERS
begin atomic
--返回值0:没有该检验项目。1:有检验项目,但全部合格。2:有检验项,但有一个不合格。(只要有一个不合格就判其不合格)
DECLARE IResult INTEGER
DECLARE ICount INTEGER
set IResult=0
--REPORTTYPE:1:外单位、0:非外单位
if REPORTTYPE=1 then
set ICount=(
select count(1) from DETECT_END_INFO where
CHECK_OUT_UNIT_INFO_ID=RESULTID and locate(ITEMNAME,PROJECT_NAME)>0
end
DB2的locate和posstr
先说一下两个函数的用法
locate(arg1,arg2,<pos>)
查找arg2中第一次出现arg1的位置,指定pos,则
从arg2的pos处开始找arg1第一次出现的位置。
posstr(arg1,arg2)查看arg2在arg1中的位置
SELECT POSSTR('MYTEST-100',('TEST-'||A.COL_VC)) FROM T_TEST_ZRK A //error
SELECT POSSTR('MYTEST-100',('TEST-' )) FROM T_TEST_ZRK A//success
SELECT POSSTR('MYTEST-100',a.COL_VC) FROM T_TEST_ZRK A//error
SELECT POSSTR(A.COL_VC,'2') FROM T_TEST_ZRK A//success
select locate(('TEST-'||A.COL_VC),'MYTEST-100'),a.col_vc FROM T_TEST_ZRK A//success
select locate(('好-'||A.COL_VC),'你好-'||a.col_vc),a.col_vc FROM T_TEST_ZRK A//success
从上面几个语句,很容易看出来。
posstr中arg2是只能是固定的str,不能使用字段代替,arg1就可以动态生成
locate中arg1和arg2都可以动态生成。
我觉得就得写个函数来做这件事情,因为DB2好像没有这种统计特定字符出现字数的函数,自己写个吧,基本算法是这样:1.用locate函数找到逗号
2.substr函数截取逗号之后的字符串
3.调到第一步执行,直到substr取到的字符串为空
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)