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