REPLACE 函数在 AS/400 DB2 中不可用
REPLACE function not available in AS/400 DB2
我正在尝试替换或删除 DB2/400 IBM System i 中帧读取数据中的“-”字符。在 MS-SQL 中使用 REPLACE 函数进行替换很常见,但在 DB2/400 V5R2 中似乎没有此功能。
有人可以在这方面帮助我吗?
您必须实际使用 DB2/400...
当前支持的 DB2 for i 版本(6.1、7.1 和 7.2)具有 REPLACE() 函数。
我的 DB2 for i5/OS v5r4 参考也显示 REPLACE()。
似乎 REPLACE() 已添加到 DB2 for iSeries v5r3;于 2004 年 6 月发布。
我想您可能会找到一篇 2004 年之前的文章,其中介绍了如何创建等效的用户定义函数。
在 v5r3 上进行了轻微测试,以下是 有点功能 用户定义函数 (UDF) 版本的 [因为缺少 DB2/400 SQL -supplied] 在 v5r2 上替换标量;术语 "somewhat" 的意思是,用于键入的默认混合与 SBCS 和 CCSID 以及限制不同字符串输入和 return 值的指定长度,尽管这些可以由 CREATE FUNCTION 的调用者调整根据任何人的需要调用先前创建的 REPLACEX 标量 UDF:
CREATE FUNCTION REPLACEX /* private version of REPLACE() */
( SRC_STR VARCHAR(5000) /* source string; for mixed data or ccsid 1208? */
, FND_STR VARCHAR( 100) /* search string */
, RPL_STR VARCHAR( 100) /* replace-with string */
) RETURNS VARCHAR(8000) /* return string; for mixed data or ccsid 1208? */
LANGUAGE SQL
SPECIFIC REPLACEX
RETURNS NULL ON NULL INPUT
NO EXTERNAL ACTION
ALLOW PARALLEL
SET OPTION SRTSEQ=*HEX
, DECMPT=*PERIOD
, DBGVIEW=*SOURCE
BEGIN
declare strpos int default 1 ; /* start position for locate */
declare nxtpos int default 0 ; /* next "found" position */
declare fndlen int default 0 ; /* length of fnd_str */
declare rtnstr varchar(8000) default '' ; /* result-string */
set nxtpos = locate( fnd_str, src_str, strpos ) ;
set fndlen = length( fnd_str ) ;
while ( nxtpos > 0 ) do
set rtnstr = rtnstr
concat substr( src_str, strpos, ( nxtpos - strpos ) )
concat rpl_str
;
set strpos = nxtpos + fndlen ;
set nxtpos = locate( fnd_str, src_str , strpos ) ;
if ( nxtpos > 0 ) then /* adjust per *start* spec on LOCATE */
set nxtpos = nxtpos + strpos - 1 ;
end if ;
end while ;
set rtnstr = rtnstr
concat substr( src_str, strpos )
;
return
rtnstr
;
END
我正在尝试替换或删除 DB2/400 IBM System i 中帧读取数据中的“-”字符。在 MS-SQL 中使用 REPLACE 函数进行替换很常见,但在 DB2/400 V5R2 中似乎没有此功能。 有人可以在这方面帮助我吗?
您必须实际使用 DB2/400...
当前支持的 DB2 for i 版本(6.1、7.1 和 7.2)具有 REPLACE() 函数。
我的 DB2 for i5/OS v5r4 参考也显示 REPLACE()。
似乎 REPLACE() 已添加到 DB2 for iSeries v5r3;于 2004 年 6 月发布。
我想您可能会找到一篇 2004 年之前的文章,其中介绍了如何创建等效的用户定义函数。
在 v5r3 上进行了轻微测试,以下是 有点功能 用户定义函数 (UDF) 版本的 [因为缺少 DB2/400 SQL -supplied] 在 v5r2 上替换标量;术语 "somewhat" 的意思是,用于键入的默认混合与 SBCS 和 CCSID 以及限制不同字符串输入和 return 值的指定长度,尽管这些可以由 CREATE FUNCTION 的调用者调整根据任何人的需要调用先前创建的 REPLACEX 标量 UDF:
CREATE FUNCTION REPLACEX /* private version of REPLACE() */
( SRC_STR VARCHAR(5000) /* source string; for mixed data or ccsid 1208? */
, FND_STR VARCHAR( 100) /* search string */
, RPL_STR VARCHAR( 100) /* replace-with string */
) RETURNS VARCHAR(8000) /* return string; for mixed data or ccsid 1208? */
LANGUAGE SQL
SPECIFIC REPLACEX
RETURNS NULL ON NULL INPUT
NO EXTERNAL ACTION
ALLOW PARALLEL
SET OPTION SRTSEQ=*HEX
, DECMPT=*PERIOD
, DBGVIEW=*SOURCE
BEGIN
declare strpos int default 1 ; /* start position for locate */
declare nxtpos int default 0 ; /* next "found" position */
declare fndlen int default 0 ; /* length of fnd_str */
declare rtnstr varchar(8000) default '' ; /* result-string */
set nxtpos = locate( fnd_str, src_str, strpos ) ;
set fndlen = length( fnd_str ) ;
while ( nxtpos > 0 ) do
set rtnstr = rtnstr
concat substr( src_str, strpos, ( nxtpos - strpos ) )
concat rpl_str
;
set strpos = nxtpos + fndlen ;
set nxtpos = locate( fnd_str, src_str , strpos ) ;
if ( nxtpos > 0 ) then /* adjust per *start* spec on LOCATE */
set nxtpos = nxtpos + strpos - 1 ;
end if ;
end while ;
set rtnstr = rtnstr
concat substr( src_str, strpos )
;
return
rtnstr
;
END